home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Gekkan Dennou Club 147
/
Gekkan Dennou Club - 2000.8 Vol. 147 (Japan).7z
/
Gekkan Dennou Club - 2000.8 Vol. 147 (Japan) (Track 1).bin
/
games
/
greversi
/
src.lzh
/
src
/
graph.s
< prev
next >
Wrap
Text File
|
2000-02-04
|
74KB
|
3,487 lines
;----------------------------------------------------------------
; greversi.x v0.14 (2000.02.04) by M.Kamada
; graph.s 描画・入力ルーチン
;----------------------------------------------------------------
.include doscall.mac
.include iocscall.mac
.include iomap.equ
.include iocswork.equ
.include const.equ
BG_PAGE equ 0 ;BGはBG0の1枚だけ
BG_TEXT equ 1 ;BGテキスト1を使用する
;→パターンは192個使用可能
NULL_PATTERN equ 0 ;BGの空きのパターン(1個)の番号
MASK_PATTERN equ 1 ;BGのマスクのパターン(2個)の番号
CURSOR_PATTERN equ 3 ;マウスカーソルのパターン(1個)の番号
TURN_PATTERN equ 4 ;手番表示のパターン(1個)の番号
NUMBER_PATTERN equ 10 ;数字のパターン(4*10=40個)の番号の先頭
MOJI_PATTERN equ 50 ;文字のパターンの番号の先頭
TURN_PALETTE equ 0 ;手番表示のパレットブロックの番号
MASK_PALETTE equ 1 ;BGのマスクのパレットブロックの番号
NUMBER_PALETTE equ 2 ;数字のパレットブロックの番号
BLACK_PALETTE equ NUMBER_PALETTE ;黒の文字のパレットブロックの番号
WHITE_PALETTE equ NUMBER_PALETTE ;白の文字のパレットブロックの番号
WINDOW0_PALETTE equ 3 ;ウィンドウ0の文字のパレットブロックの番号
WINDOW1_PALETTE equ 4 ;ウィンドウ1の文字のパレットブロックの番号
CURSOR_PALETTE equ 5 ;マウスカーソルのパレットブロックの番号
CURSOR_SPRITE equ 0 ;マウスカーソルのスプライトの番号
TURN_SPRITE equ 1 ;手番表示のスプライト(2個)の番号
COUNTER_SPRITE equ 10 ;カウンタの数字のスプライト(6*4=24個)の番号の先頭
MOJI_SPRITE equ 34 ;文字のスプライトの番号の先頭
MOJI_BLACK_X equ 10 ;黒のBG表示位置のX座標
MOJI_BLACK_Y equ 2 ;黒のBG表示位置のY座標
MOJI_WHITE_X equ 17 ;白のBG表示位置のX座標
MOJI_WHITE_Y equ 2 ;白のBG表示位置のY座標
MOJI_PASS_X equ 14 ;パスのBG表示位置のX座標
MOJI_PASS_Y equ 15 ;パスのBG表示位置のY座標
NUMBER_WIDTH equ 20 ;数字のパターンの幅
BLACK_COUNT_X equ 16*MOJI_BLACK_X+24+12-(24-NUMBER_WIDTH)/2 ;黒の石の数の表示位置のX座標
BLACK_COUNT_Y equ 16*MOJI_BLACK_Y ;黒の石の数の表示位置のY座標
WHITE_COUNT_X equ 16*MOJI_WHITE_X+24+12-(24-NUMBER_WIDTH)/2 ;白の石の数の表示位置のX座標
WHITE_COUNT_Y equ 16*MOJI_WHITE_Y ;白の石の数の表示位置のY座標
PASS_WAIT equ 100 ;パスの待ち時間(垂直同期単位)
CURSOR_HOT_X equ 0 ;マウスカーソルのホットスポットのX座標(0~15)
CURSOR_HOT_Y equ 0 ;マウスカーソルのホットスポットのY座標(0~15)
.ifndef _PRIORITY
_PRIORITY equ $92
.endif
;----------------------------------------------------------------
grb .macro g,r,b
.dc.w (g<<11)+(r<<6)+(b<<1)
.endm
;----------------------------------------------------------------
;1マス分の全パターンデータのバッファのサイズ
PATBUF_SIZE_UNIT equ 1024*230
;1マス分のGRAMセーブエリアのサイズ
GRAM_SAVE_AREA_SIZE equ 4096
GRAM_SAVE_SEPARATELY equ 1
;----------------------------------------------------------------
;位置を入力させる
;>d0.l:オフセット(255=盤の外,-1=右ボタンが押された)
;>d1.l:(X座標<<16)+(Y座標)
.text
.align 4,$2048
input_pos::
10: IOCS _B_KEYSNS
tst.l d0
beq 20f
cmp.b #$03,d0
bne @f
DOS _KEYSNS
@@: IOCS _B_KEYINP
tst.l d0
beq 20f
cmp.b #$0D,d0
beq 93f
cmp.b #$1B,d0
beq 92f
cmp.b #' ',d0
beq 93f
bra 10b
20: IOCS _MS_CURGT
move.l d0,d1
.if 0 ;割り込み駆動に変更したので不要
movem.l d1-d5/a0,-(sp)
move.l #$00000000+CURSOR_SPRITE,d1
move.w d0,d3
swap.w d0
move.w d0,d2
.if 1
add.w #16,d2
add.w #16,d3
.else
;256×256のマウス座標を画面上のボードにはめ込むとき
sub.w #128,d2
sub.w #128,d3
swap.w d0
add.w d0,d0
add.w d0,d0
lea.l (msconv_table,pc),a0
adda.w d0,a0
muls.w (a0)+,d2
muls.w (a0)+,d3
asl.l #2,d2
asl.l #2,d3
clr.w d2
clr.w d3
swap.w d2
swap.w d3
add.w #256,d2
add.w #256,d3
.endif
move.l #CURSOR_PALETTE*256+CURSOR_PATTERN,d4
move.l #3,d5
IOCS _SP_REGST
movem.l (sp)+,d1-d5/a0
.endif
;ボタンが押されるまで待つ
IOCS _MS_GETDT
tst.b d0
bne 90f
tst.w d0
beq 10b
;ボタンが離されるまで待つ
@@: IOCS _MS_GETDT
tst.b d0
bne 90f
tst.w d0
bne @b
move.l a0,-(sp)
move.l d1,-(sp)
add.w d1,d1
add.w d1,d1 ;Y×4
lea.l board_map,a0
movea.l (a0,d1.w),a0 ;ラスタの先頭
swap.w d1 ;X
@@: move.w (a0)+,d0
cmp.w (a0)+,d1
bcc @b ;-1があるので(d1=-1でない限り)必ず止まる
cmp.w #255,d0
beq @f
moveq.l #$38,d1
and.w d0,d1
lsr.w #3,d1
add.w d1,d0
add.w #10,d0
@@: ext.l d0
move.l (sp)+,d1
movea.l (sp)+,a0
tst.l d0
99: rts
92: moveq.l #0,d1
90: moveq.l #-1,d0
bra 99b
93: moveq.l #-1,d1
move.b d0,d1
move.l #255,d0
bra 99b
.if 0
;マウス座標からスプライト座標への変換
; msarea(0,0,255,255)のとき
; sx=(mx-128)*384*sqr(13)/(1168-my)+256
; sy=(my-128)*1536/(1168-my)+256
SQR13 fequ 3.60555127546398929311922126747
.align 4,$2048
msconv_table:
my = 0
.rept 256
.dc.w 16384.0*384.0*SQR13/(1168.0-my)
.dc.w 16384.0*1536.0/(1168.0-my)
my = my+1
.endm
.endif
;----------------------------------------------------------------
;盤の状態を表示する
.text
.align 4,$2048
draw_ban::
movem.l d0-d5/a0-a1,-(sp)
bsr super
lea.l ban+P11,a1
moveq.l #0,d5
moveq.l #8-1,d3
3: moveq.l #8-1,d2
2: move.b (a1)+,d4
beq 5f ;空き
move.l d5,d0
subq.b #B,d4
bne 41f
addq.l #1,black_count
moveq.l #0,d1
bra 42f
41: addq.l #1,white_count
moveq.l #36,d1
42: bsr animpat1
5: addq.w #1,d5
dbra d2,2b
addq.l #1,a1
dbra d3,3b
bsr user
movem.l (sp)+,d0-d5/a0-a1
rts
;----------------------------------------------------------------
;終局を表示する
;<d6.b:自分の石
;<d7.b:相手の石
;>n-flag:mi=終了
.text
.align 4,$2048
draw_over::
movem.l d1-d3/d6-d7/a1-a4,-(sp)
bsr super
move.l #((256-24-8)<<16)+(256-20-32-9),d1
move.l #((8+24*2+8-1)<<16)+(9+32+9-1),d2
bsr open_window
moveq.l #0,d0
bsr window0_palet
move.l #MOJI_SPRITE,d1
move.l #256-24,d2
move.l #256-20-32,d3
lea.l (draw_over_string,pc),a1
bsr draw_string
moveq.l #0,d0
bra 2f
1: bsr keyctrl_vwait
bsr window0_palet
2: addq.w #1,d0
cmp.w #31,d0
bls 1b
move.w black_count+2,d0
sub.w white_count+2,d0
beq 10f ;引き分け
bmi 1f
;黒の勝ち
lea.l (draw_over_black_string,pc),a1
tst.w white_count+2
bne 2f
moveq.l #64,d0
bra 2f
;白の勝ち
1: neg.w d0
lea.l (draw_over_white_string,pc),a1
tst.w black_count+2
bne 2f
moveq.l #64,d0
2: movea.l d0,a2
;<a1.l:勝者を示す文字列
;<a2.l:石差
move.l #((256-(8+24*7+8)/2)<<16)+(256+20-9),d1
move.l #((8+24*7+8-1)<<16)+(9+32+9-1),d2
bsr open_window
moveq.l #0,d0
bsr window1_palet
move.l #MOJI_SPRITE+4*2,d1
move.l #256-(24*7)/2,d2
move.l #256+20,d3
bsr draw_string
.if NUMBER_WIDTH<24
add.w #24-NUMBER_WIDTH,d2
.endif
move.l a2,d0 ;石差
divu.w #10,d0 ;石差÷10
bne 1f
;石差が1桁のとき
add.w #NUMBER_WIDTH,d2
bra 2f
;石差が2桁のとき
1:
;石差の10の位
add.w d0,d0
add.w d0,d0
add.w #WINDOW1_PALETTE*256+MOJI_PATTERN_0,d0
move.l #-1,-(sp)
move.w d0,-(sp)
clr.w -(sp)
movea.l sp,a1
bsr draw_string
addq.l #8,sp
;石差の1の位
2: swap.w d0
add.w d0,d0
add.w d0,d0
add.w #WINDOW1_PALETTE*256+MOJI_PATTERN_0,d0
move.l #-1,-(sp)
move.w d0,-(sp)
clr.w -(sp)
movea.l sp,a1
bsr draw_string
addq.l #8,sp
.if NUMBER_WIDTH<24
add.w #24-NUMBER_WIDTH,d2
.endif
lea.l (draw_over_winner_string,pc),a1
bsr draw_string
bra 20f
;引き分け
10: suba.l a2,a2 ;石差
move.l #((256-(8+24*4+8)/2)<<16)+(256+20-9),d1
move.l #((8+24*4+8-1)<<16)+(9+32+9-1),d2
bsr open_window
moveq.l #0,d0
bsr window1_palet
move.l #MOJI_SPRITE+4*2,d1
move.l #256-(24*4)/2,d2
move.l #256+20,d3
lea.l (draw_over_draw_string,pc),a1
bsr draw_string
20:
movea.l d1,a4
moveq.l #0,d0
bra 2f
1: bsr keyctrl_vwait
bsr window1_palet
2: addq.w #1,d0
cmp.w #31,d0
bls 1b
bsr input_pos
movea.l d0,a3
moveq.l #30,d0
@@: bsr keyctrl_vwait
bsr window1_palet
dbra d0,@b
move.l #MOJI_SPRITE+4*2,d1
move.l a4,d0
sub.l d1,d0
bsr erase_string
move.l #((256-(8+24*7+8)/2)<<16)+(256+20-9),d1
move.l #((8+24*7+8-1)<<16)+(9+32+9-1),d2
move.l a2,d0 ;石差
bne @f
move.l #((256-(8+24*4+8)/2)<<16)+(256+20-9),d1
move.l #((8+24*4+8-1)<<16)+(9+32+9-1),d2
@@: bsr close_window
moveq.l #30,d0
@@: bsr keyctrl_vwait
bsr window0_palet
dbra d0,@b
move.l #MOJI_SPRITE,d1
move.l #4+4,d0
bsr erase_string
move.l #((256-24-8)<<16)+(256-20-32-9),d1
move.l #((8+24*2+8-1)<<16)+(9+32+9-1),d2
bsr close_window
bsr user
move.l a3,d0
movem.l (sp)+,d1-d3/d6-d7/a1-a4
rts
;パレットブロック×256+パターン番号,bit14=hrev,bit15=vrev
.align 4,$2048
draw_over_string:
.dc.l WINDOW0_PALETTE*256+MOJI_PATTERN_終
.dc.l WINDOW0_PALETTE*256+MOJI_PATTERN_局
.dc.l -1
draw_over_black_string:
.dc.l WINDOW1_PALETTE*256+MOJI_PATTERN_黒
.dc.l WINDOW1_PALETTE*256+MOJI_PATTERN_の
.dc.l -1
draw_over_white_string:
.dc.l WINDOW1_PALETTE*256+MOJI_PATTERN_白
.dc.l WINDOW1_PALETTE*256+MOJI_PATTERN_の
.dc.l -1
draw_over_winner_string:
.dc.l WINDOW1_PALETTE*256+MOJI_PATTERN_石
.dc.l WINDOW1_PALETTE*256+MOJI_PATTERN_勝
.dc.l WINDOW1_PALETTE*256+MOJI_PATTERN_ち
.dc.l -1
draw_over_draw_string:
.dc.l WINDOW1_PALETTE*256+MOJI_PATTERN_引
.dc.l WINDOW1_PALETTE*256+MOJI_PATTERN_き
.dc.l WINDOW1_PALETTE*256+MOJI_PATTERN_分
.dc.l WINDOW1_PALETTE*256+MOJI_PATTERN_け
.dc.l -1
;----------------------------------------------------------------
;メニューを表示して選択させる
;>d0.l:-1=キャンセル,0=終了,1=対局
.text
.align 4,$2048
draw_menu::
movem.l d0-d3/a1/a3-a4,-(sp)
bsr super
move.l #((256-(8+24*5+8)/2)<<16)+(256-(9+32*5+9)/2),d1
move.l #(((8+24*5+8)-1)<<16)+((9+32*5+9)-1),d2
bsr open_window
moveq.l #0,d0
bsr window0_palet
move.l #MOJI_SPRITE,d1
move.l #256-(24*5)/2,d2
move.l #256-(32*5)/2,d3
lea.l (draw_menu_対局,pc),a1
bsr draw_string
move.l #256-(24*5)/2,d2
move.l #256-(32*5)/2+32,d3
lea.l (draw_menu_先手,pc),a1
bsr draw_string
move.l #256-(24*5)/2+24*2+12,d2
move.l #256-(32*5)/2+32,d3
lea.l (draw_menu_後手,pc),a1
bsr draw_string
move.l #256-(24*5)/2,d2
move.l #256-(32*5)/2+32*2,d3
lea.l (draw_menu_レベル,pc),a1
bsr draw_string
move.l #256-(24*5)/2+24*5-NUMBER_WIDTH*5,d2
move.l #256-(32*5)/2+32*3,d3
lea.l (draw_menu_12345,pc),a1
bsr draw_string
move.l #256-(24*5)/2,d2
move.l #256-(32*5)/2+32*4,d3
lea.l (draw_menu_終了,pc),a1
bsr draw_string
movea.l d1,a4
moveq.l #0,d0
bra 2f
1: bsr keyctrl_vwait
bsr window0_palet
2: addq.w #1,d0
cmp.w #31,d0
bls 1b
;先手 後手
move.w mode,d0
beq 5f
subq.w #3,d0
beq 5f
move.l #((256-(24*5)/2)<<16)+(256-(32*5)/2+32+32-3),d1
move.l #((24*2-1)<<16)+(3-1),d2
moveq.l #1,d0
and.w mode,d0
beq @f
add.l #(24*2+12)<<16,d1
@@: bsr draw_window_frame
5:
;レベル
move.w level,d0
move.l #((256-(24*5)/2+24*5-NUMBER_WIDTH*5)<<16)+(256-(32*5)/2+32*3+32-3),d1
move.l #((NUMBER_WIDTH-1)<<16)+(3-1),d2
subq.w #1,d0
mulu.w #NUMBER_WIDTH,d0
swap.w d0
clr.w d0
add.l d0,d1
bsr draw_window_frame
10: bsr input_pos
movea.l d0,a3
bmi 19f
cmp.l #$FFFFFF00+$0D,d1
beq 111f ;対局
cmp.l #$FFFFFF00+' ',d1
beq 111f ;対局
swap.w d1
sub.w #256-(24*5)/2,d1
bcs 10b
cmp.w #24*5,d1
bcc 10b
swap.w d1
sub.w #256-(32*5)/2,d1
bcs 10b
lsr.w #5,d1
cmp.w #5,d1
bcc 10b
subq.w #1,d1
bcs 11f ;対局
beq 12f ;先手 後手
subq.w #2,d1
bcs 10b ;レベル
beq 14f ;12345
;終了
swap.w d1
sub.w #24*2,d1
bcc 10b
suba.l a3,a3
bra 19f
;対局
11: swap.w d1
sub.w #24*2,d1
bcc 10b
111: movea.w #1,a3
bra 19f
;先手 後手
12: swap.w d1
sub.w #24*2,d1
bcs 1f
sub.w #12,d1
bcs 10b
sub.w #24*2,d1
bcc 10b
;後手
cmpi.w #1,mode
beq 10b
move.w mode,d0
beq 5f
subq.w #3,d0
beq 5f
move.l #((256-(24*5)/2)<<16)+(256-(32*5)/2+32+32-3),d1
move.l #((24*2-1)<<16)+(3-1),d2
moveq.l #1,d0
and.w mode,d0
beq @f
add.l #(24*2+12)<<16,d1
@@: bsr erase_window_frame
5:
move.w #1,mode ;0=man-man,1=com-man,2=man-com,3=com-com
move.l #((256-(24*5)/2)<<16)+(256-(32*5)/2+32+32-3),d1
move.l #((24*2-1)<<16)+(3-1),d2
moveq.l #1,d0
and.w mode,d0
beq @f
add.l #(24*2+12)<<16,d1
@@: bsr draw_window_frame
bra 10b
;先手
1: cmpi.w #2,mode
beq 10b
move.w mode,d0
beq 5f
subq.w #3,d0
beq 5f
move.l #((256-(24*5)/2)<<16)+(256-(32*5)/2+32+32-3),d1
move.l #((24*2-1)<<16)+(3-1),d2
moveq.l #1,d0
and.w mode,d0
beq @f
add.l #(24*2+12)<<16,d1
@@: bsr erase_window_frame
5:
move.w #2,mode ;0=man-man,1=com-man,2=man-com,3=com-com
move.l #((256-(24*5)/2)<<16)+(256-(32*5)/2+32+32-3),d1
move.l #((24*2-1)<<16)+(3-1),d2
moveq.l #1,d0
and.w mode,d0
beq @f
add.l #(24*2+12)<<16,d1
@@: bsr draw_window_frame
bra 10b
;レベル
13: bra 10b
;12345
14: swap.w d1
sub.w #24*5-NUMBER_WIDTH*5,d1
bcs 10b
ext.l d1
divu.w #NUMBER_WIDTH,d1
addq.w #1,d1
cmp.w level,d1
beq 10b
move.w level,d0
move.w d1,level ;1~5
move.l #((256-(24*5)/2+24*5-NUMBER_WIDTH*5)<<16)+(256-(32*5)/2+32*3+32-3),d1
move.l #((NUMBER_WIDTH-1)<<16)+(3-1),d2
subq.w #1,d0
mulu.w #NUMBER_WIDTH,d0
swap.w d0
clr.w d0
add.l d0,d1
bsr erase_window_frame
move.w level,d0
move.l #((256-(24*5)/2+24*5-NUMBER_WIDTH*5)<<16)+(256-(32*5)/2+32*3+32-3),d1
move.l #((NUMBER_WIDTH-1)<<16)+(3-1),d2
subq.w #1,d0
mulu.w #NUMBER_WIDTH,d0
swap.w d0
clr.w d0
add.l d0,d1
bsr draw_window_frame
bra 10b
19:
;先手 後手
move.w mode,d0
beq 5f
subq.w #3,d0
beq 5f
move.l #((256-(24*5)/2)<<16)+(256-(32*5)/2+32+32-3),d1
move.l #((24*2-1)<<16)+(3-1),d2
moveq.l #1,d0
and.w mode,d0
beq @f
add.l #(24*2+12)<<16,d1
@@: bsr erase_window_frame
5:
;レベル
move.w level,d0
move.l #((256-(24*5)/2+24*5-NUMBER_WIDTH*5)<<16)+(256-(32*5)/2+32*3+32-3),d1
move.l #((NUMBER_WIDTH-1)<<16)+(3-1),d2
subq.w #1,d0
mulu.w #NUMBER_WIDTH,d0
swap.w d0
clr.w d0
add.l d0,d1
bsr erase_window_frame
moveq.l #30,d0
@@: bsr keyctrl_vwait
bsr window0_palet
dbra d0,@b
move.l #MOJI_SPRITE,d1
move.l a4,d0
sub.l d1,d0
bsr erase_string
move.l #((256-(8+24*5+8)/2)<<16)+(256-(9+32*5+9)/2),d1
move.l #(((8+24*5+8)-1)<<16)+((9+32*5+9)-1),d2
bsr close_window
bsr user
move.l a3,d0
movem.l (sp)+,d0-d3/a1/a3-a4
rts
;パレットブロック×256+パターン番号,bit14=hrev,bit15=vrev
.align 4,$2048
draw_menu_対局:
.dc.l WINDOW0_PALETTE*256+MOJI_PATTERN_対
.dc.l WINDOW0_PALETTE*256+MOJI_PATTERN_局
.dc.l -1
draw_menu_先手:
.dc.l WINDOW0_PALETTE*256+MOJI_PATTERN_先
.dc.l WINDOW0_PALETTE*256+MOJI_PATTERN_手
.dc.l -1
draw_menu_後手:
.dc.l WINDOW0_PALETTE*256+MOJI_PATTERN_後
.dc.l WINDOW0_PALETTE*256+MOJI_PATTERN_手
.dc.l -1
draw_menu_レベル:
.dc.l WINDOW0_PALETTE*256+MOJI_PATTERN_レ
.dc.l WINDOW0_PALETTE*256+MOJI_PATTERN_ベ
.dc.l WINDOW0_PALETTE*256+MOJI_PATTERN_ル
.dc.l -1
draw_menu_12345:
.dc.l WINDOW0_PALETTE*256+MOJI_PATTERN_1
.dc.l WINDOW0_PALETTE*256+MOJI_PATTERN_2
.dc.l WINDOW0_PALETTE*256+MOJI_PATTERN_3
.dc.l WINDOW0_PALETTE*256+MOJI_PATTERN_4
.dc.l WINDOW0_PALETTE*256+MOJI_PATTERN_5
.dc.l -1
draw_menu_終了:
.dc.l WINDOW0_PALETTE*256+MOJI_PATTERN_終
.dc.l WINDOW0_PALETTE*256+MOJI_PATTERN_了
.dc.l -1
;----------------------------------------------------------------
;ウィンドウの中に枠を表示する
;<d1.l:(X始点<<16)+Y始点
;<d2.l:(X差分<<16)+Y差分
.text
.align 4,$2048
draw_window_frame:
movem.l d0/a1,-(sp)
lea.l (-2*6,sp),sp
bsr vwait
movea.l sp,a1
move.w #1,(a1)+
move.l d1,(a1)+
move.l d2,(a1)+
move.w #$FFFF,(a1)+
movea.l sp,a1
IOCS _TXFILL
clr.w (sp)
clr.w (2*5,sp)
movea.l sp,a1
IOCS _TXFILL
lea.l (2*6,sp),sp
movem.l (sp)+,d0/a1
rts
;----------------------------------------------------------------
;ウィンドウの中の枠を消す
;<d1.l:(X始点<<16)+Y始点
;<d2.l:(X差分<<16)+Y差分
.text
.align 4,$2048
erase_window_frame:
movem.l d0/a1,-(sp)
lea.l (-2*6,sp),sp
bsr vwait
movea.l sp,a1
clr.w (a1)+
move.l d1,(a1)+
move.l d2,(a1)+
move.w #$FFFF,(a1)+
movea.l sp,a1
IOCS _TXFILL
move.w #1,(sp)
clr.w (2*5,sp)
movea.l sp,a1
IOCS _TXFILL
lea.l (2*6,sp),sp
movem.l (sp)+,d0/a1
rts
;----------------------------------------------------------------
;パスを表示して少し待つ
;<d6.b:自分の石
;<d7.b:相手の石
.text
.align 4,$2048
draw_pass::
movem.l d1-d3/a1,-(sp)
bsr super
move.l #((256-(8+24+12+24+24+8)/2)<<16)+(256-16-9),d1
move.l #((8+24+12+24+24+8-1)<<16)+(9+32+9-1),d2
bsr open_window
moveq.l #0,d0
bsr window0_palet
move.l #MOJI_SPRITE,d1
move.l #256-(24+12+24+24)/2,d2
move.l #256-16,d3
move.l #-1,-(sp)
cmp.b #B,d6
bne 1f
move.l #WINDOW0_PALETTE*256+MOJI_PATTERN_黒,-(sp)
bra 2f
1: move.l #WINDOW0_PALETTE*256+MOJI_PATTERN_白,-(sp)
2: movea.l sp,a1
bsr draw_string
addq.l #8,sp
add.w #12,d2
lea.l (draw_pass_string,pc),a1
bsr draw_string
moveq.l #0,d0
bra 2f
1: bsr keyctrl_vwait
bsr window0_palet
2: addq.w #1,d0
cmp.w #31,d0
bls 1b
move.w #PASS_WAIT-1,d0
@@: bsr vwait
dbra d0,@b
moveq.l #30,d0
@@: bsr keyctrl_vwait
bsr window0_palet
dbra d0,@b
move.l d1,d0
move.l #MOJI_SPRITE,d1
sub.l d1,d0
bsr erase_string
move.l #((256-(8+24+12+24+24+8)/2)<<16)+(256-16-9),d1
move.l #((8+24+12+24+24+8-1)<<16)+(9+32+9-1),d2
bsr close_window
bsr user
movem.l (sp)+,d1-d3/a1
rts
;パレットブロック×256+パターン番号,bit14=hrev,bit15=vrev
.align 4,$2048
draw_pass_string:
.dc.l WINDOW0_PALETTE*256+MOJI_PATTERN_パ
.dc.l WINDOW0_PALETTE*256+MOJI_PATTERN_ス
.dc.l -1
;----------------------------------------------------------------
;文字ウィンドウを開く
; 必ず始点<終点であること
; 画面内に収まる位置を指定すること
; パレットは固定
;<d1.l:(X始点<<16)+Y始点
;<d2.l:(X差分<<16)+Y差分
.text
.align 4,$2048
open_window:
movem.l d0-d3/a1,-(sp)
bsr super
lea.l (-2*6,sp),sp
movea.l sp,a1
clr.w (a1)+
move.l d1,(a1)+
move.l d2,(a1)+
move.w #$00FF,(a1)+
move.l d2,d3
swap.w d3 ;X差分
cmp.w d2,d3
blo @f ;縦長
move.w d2,d3 ;横長または正方形
@@:
;<d3.w:短い辺の差分
subq.w #1,d3
lsr.w #1,d3
lea.l (2,sp),a1
add.w d3,(a1)+
add.w d3,(a1)+
move.w d3,d0
add.w d0,d0
sub.w d0,(a1)+
sub.w d0,(a1)+
3: bsr keyctrl_vwait
movea.l sp,a1
IOCS _TXBOX
lea.l (2,sp),a1
subq.w #1,(a1)+
subq.w #1,(a1)+
addq.w #1+1,(a1)+
addq.w #1+1,(a1)+
dbra d3,3b
movea.l sp,a1
move.w #1,(a1)+
addq.w #3,(a1)+
addq.w #4,(a1)+
subq.w #3+3,(a1)+
subq.w #4+4,(a1)+
movea.l sp,a1
IOCS _TXBOX
lea.l (2*6,sp),sp
bsr user
movem.l (sp)+,d0-d3/a1
rts
;----------------------------------------------------------------
;文字ウィンドウを閉じる
; 必ず始点<終点であること
; 画面内に収まる位置を指定すること
; パレットは固定
;<d1.l:(X始点<<16)+Y始点
;<d2.l:(X差分<<16)+Y差分
.text
.align 4,$2048
close_window:
movem.l d0-d3/a1,-(sp)
bsr super
lea.l (-2*6,sp),sp
movea.l sp,a1
addq.l #2,a1
move.l d1,(a1)+
move.l d2,(a1)+
clr.w (a1)+
move.l d2,d3
swap.w d3 ;X差分
cmp.w d2,d3
blo @f ;縦長
move.w d2,d3 ;横長または正方形
@@:
;<d3.w:短い辺の差分
subq.w #1,d3
lsr.w #1,d3
3: bsr keyctrl_vwait
movea.l sp,a1 ;$8003で済ませたいところだがROM1.0が対応していない
clr.w (a1)
IOCS _TXBOX
movea.l sp,a1
move.w #1,(a1)
IOCS _TXBOX
lea.l (2,sp),a1
addq.w #1,(a1)+
addq.w #1,(a1)+
subq.w #1+1,(a1)+
subq.w #1+1,(a1)+
dbra d3,3b
lea.l (2*6,sp),sp
bsr user
movem.l (sp)+,d0-d3/a1
rts
;----------------------------------------------------------------
;ウィンドウに文字列を表示する
;<d1.l:先頭のスプライト番号
;<d2.l:X座標
;<d3.l:Y座標
;<a1.l:文字列の情報の先頭
; .dc.l (パレットブロック×256+パターン番号,bit14=hrev,bit15=vrev)
; :
; .dc.l -1
;>d1.l:次のスプライト番号
;>d2.l:次のX座標
;>d3.l:次のY座標
.text
.align 4,$2048
draw_string:
movem.l d0/d4-d5/a1,-(sp)
bset.l #31,d1
moveq.l #16,d0
add.l d0,d2
add.l d0,d3
move.l #3,d5
bra 2f
1:
;<d1.l:スプライト番号,bit31=nowait
;<d2.l:X座標+16
;<d3.l:Y座標+16
;<d4.l:パレットブロック×256+パターン番号,bit14=hrev,bit15=vrev
;<d5.l:0=表示しない,1=BG0>BG1>SP,2=BG0>SP>BG1,3=SP>BG0>BG1
.if NUMBER_WIDTH<24
cmp.b #NUMBER_PATTERN,d4
blo @f
cmp.b #NUMBER_PATTERN+4*10,d4
bcc @f
subq.w #(24-NUMBER_WIDTH)/2,d2 ;数字のときは幅を補正する
@@:
.endif
movem.l d1-d5,-(sp)
IOCS _SP_REGST
movem.l (sp)+,d1-d5
addq.b #1,d1 ;スプライト番号
add.w #16,d2 ;X座標
addq.b #1,d4 ;パターン番号
movem.l d1-d5,-(sp)
IOCS _SP_REGST
movem.l (sp)+,d1-d5
addq.b #1,d1 ;スプライト番号
sub.w #16,d2 ;X座標
add.w #16,d3 ;Y座標
addq.b #1,d4 ;パターン番号
movem.l d1-d5,-(sp)
IOCS _SP_REGST
movem.l (sp)+,d1-d5
addq.b #1,d1 ;スプライト番号
add.w #16,d2 ;X座標
addq.b #1,d4 ;パターン番号
movem.l d1-d5,-(sp)
IOCS _SP_REGST
movem.l (sp)+,d1-d5
.if NUMBER_WIDTH<24
cmp.b #NUMBER_PATTERN,d4
blo @f
cmp.b #NUMBER_PATTERN+4*10,d4
bcc @f
subq.w #(24-NUMBER_WIDTH)-(24-NUMBER_WIDTH)/2,d2 ;数字のときは幅を補正する
@@:
.endif
addq.b #1,d1 ;スプライト番号
add.w #8,d2 ;X座標
sub.w #16,d3 ;Y座標
; addq.b #1,d4 ;パターン番号
2:
move.l (a1)+,d4 ;パレットブロック×256+パターン番号,bit14=hrev,bit15=vrev
bpl 1b
bclr.l #31,d1
moveq.l #16,d0
sub.l d0,d2
sub.l d0,d3
movem.l (sp)+,d0/d4-d5/a1
rts
;----------------------------------------------------------------
;ウィンドウに表示した文字列を消去する
;<d0.l:消去するスプライト数
;<d1.l:先頭のスプライト番号
;>d1.l:次のスプライト番号
.text
.align 4,$2048
erase_string:
movem.l d0/d2-d5,-(sp)
bset.l #31,d1
move.w d0,-(sp)
@@: move.l d1,-(sp)
move.l #0,d2
move.l #0,d3
move.l #0,d4
move.l #0,d5
IOCS _SP_REGST
move.l (sp)+,d1
addq.b #1,d1
subq.w #1,(sp)
bne @b
addq.l #2,sp
bclr.l #31,d1
movem.l (sp)+,d0/d2-d5
rts
;----------------------------------------------------------------
;ウィンドウ0の文字のレベルを設定する
;<d0.l:レベル(0~31)
.text
.align 4,$2048
window0_palet:
movem.l d0-d6,-(sp)
move.l d0,d5
lsl.w #5,d5
or.w d0,d5
lsl.w #6,d5
or.w #$003E,d5
move.l #$0840_1080,d6
moveq.l #16-1,d4
4: move.l #$80000000,d1 ;パレットブロック×16+パレットコード,bit31=nowait
move.w d4,d1
move.l #WINDOW0_PALETTE,d2 ;パレットブロック(0ならd1の上位4bitを使う)
move.l d5,d3 ;カラーコード
IOCS _SPALET
swap.w d6
sub.w d6,d5
dbcs d4,4b
bcc 9f
4: move.l #$80000000,d1 ;パレットブロック×16+パレットコード,bit31=nowait
move.w d4,d1
move.l #WINDOW0_PALETTE,d2 ;パレットブロック(0ならd1の上位4bitを使う)
move.l #(31<<1),d3 ;カラーコード
IOCS _SPALET
dbra d4,4b
9: movem.l (sp)+,d0-d6
rts
;----------------------------------------------------------------
;ウィンドウ1の文字のレベルを設定する
;<d0.l:レベル(0~31)
.text
.align 4,$2048
window1_palet:
movem.l d0-d6,-(sp)
move.l d0,d5
lsl.w #5,d5
or.w d0,d5
lsl.w #6,d5
or.w #$003E,d5
move.l #$0840_1080,d6
moveq.l #16-1,d4
4: move.l #$80000000,d1 ;パレットブロック×16+パレットコード,bit31=nowait
move.w d4,d1
move.l #WINDOW1_PALETTE,d2 ;パレットブロック(0ならd1の上位4bitを使う)
move.l d5,d3 ;カラーコード
IOCS _SPALET
swap.w d6
sub.w d6,d5
dbcs d4,4b
bcc 9f
4: move.l #$80000000,d1 ;パレットブロック×16+パレットコード,bit31=nowait
move.w d4,d1
move.l #WINDOW1_PALETTE,d2 ;パレットブロック(0ならd1の上位4bitを使う)
move.l #(31<<1),d3 ;カラーコード
IOCS _SPALET
dbra d4,4b
9: movem.l (sp)+,d0-d6
rts
;----------------------------------------------------------------
;黒の石の数を表示する
.text
.align 4,$2048
draw_black_count::
movem.l d0-d5,-(sp)
move.l black_count,d0
cmp.l #32<<16,d0
bcc 9f
move.l #COUNTER_SPRITE,d1
move.l #BLACK_COUNT_X,d2
move.l #BLACK_COUNT_Y,d3
move.l #NUMBER_PALETTE,d4
move.l #1,d5
bsr drawnum2
9: movem.l (sp)+,d0-d5
rts
;----------------------------------------------------------------
;白の石の数を表示する
.text
.align 4,$2048
draw_white_count::
movem.l d0-d5,-(sp)
move.l white_count,d0
cmp.l #32<<16,d0
bcc 9f
move.l #COUNTER_SPRITE+6*2,d1
move.l #WHITE_COUNT_X,d2
move.l #WHITE_COUNT_Y,d3
move.l #NUMBER_PALETTE,d4
move.l #1,d5
bsr drawnum2
9: movem.l (sp)+,d0-d5
rts
;----------------------------------------------------------------
;置いた石を表示する
;<a6.l:レコードの先頭
; 0.w ひっくり返した石の数
; 2.l 置いた位置(アドレス,置く前は空いていた)
; 6.b 置いた石
; 7.b ひっくり返した石
; 8.w ひっくり返した石の位置(置いた位置からのオフセット)
; :
;>a6.l:レコードの末尾
;?d0-d2/a0
.text
.align 4,$2048
tup_draw::
movem.l d0-d4/a0,-(sp)
bsr super
move.w (a6)+,d3 ;ひっくり返した石の数
move.l (a6)+,d2 ;置いた位置
sub.l #ban,d2
move.l d2,d0
divu.w #9,d0
subq.w #1,d0 ;y
lsl.w #3,d0
move.w d0,d1
clr.w d0
swap.w d0
subq.w #1,d0 ;x
add.w d1,d0
move.w (a6)+,d1 ;下位バイト=ひっくり返した石
subq.b #B,d1
beq 10f ;ひっくり返した石が黒=置いた石は白
;置いた石は黒
move.l d0,d4
moveq.l #0,d1
bsr standbypat1
moveq.l #1,d1
1: move.l d4,d0
bsr blendpat1
addq.w #1,black_count
bsr draw_black_count
addq.w #1,d1
cmp.w #33,d1
blo 1b
clr.w black_count
addq.w #1,black_count+2
bsr draw_black_count
subq.w #1,d3
3: movea.l d2,a0
adda.w (a6)+,a0
move.l a0,d0
divu.w #9,d0
subq.w #1,d0 ;y
lsl.w #3,d0
move.w d0,d1
clr.w d0
swap.w d0
subq.w #1,d0 ;x
add.w d1,d0
moveq.l #0,d1
bsr animpat1
dbra d3,3b
bra 99f
;置いた石は白
10:
move.l d0,d4
moveq.l #36,d1
bsr standbypat1
moveq.l #1,d1
1: move.l d4,d0
bsr blendpat1
addq.w #1,white_count
bsr draw_white_count
addq.w #1,d1
cmp.w #33,d1
blo 1b
clr.w white_count
addq.w #1,white_count+2
bsr draw_white_count
subq.w #1,d3
3: movea.l d2,a0
adda.w (a6)+,a0
move.l a0,d0
divu.w #9,d0
subq.w #1,d0 ;y
lsl.w #3,d0
move.w d0,d1
clr.w d0
swap.w d0
subq.w #1,d0 ;x
add.w d1,d0
moveq.l #36,d1
bsr animpat1
dbra d3,3b
99: bsr user
movem.l (sp)+,d0-d4/a0
rts
;----------------------------------------------------------------
;画面の初期化
.text
.align 4,$2048
init_screen::
movem.l d1-d7/a0-a6,-(sp)
move.l #(14<<16)+3,-(sp)
DOS _CONCTRL
addq.l #4,sp
moveq.l #12,d1
IOCS _CRTMOD
IOCS _G_CLR_ON
IOCS _MS_INIT
moveq.l #0,d1
moveq.l #0,d2
IOCS _SKEY_MOD
; IOCS _MS_CURON
IOCS _B_CUROFF
;テキストパレットを設定
bsr super
bsr vwait
lea.l (text_palet,pc),a0
lea.l $00E82200,a1
moveq.l #16-1,d0
@@: move.w (a0)+,(a1)+
dbra d0,@b
bsr user
.if 0
;マウスカーソルを変更する
moveq.l #15,d1
lea.l (mouse_cursor,pc),a1
IOCS _MS_PATST
moveq.l #15,d1
IOCS _MS_SEL
.endif
;スプライトを初期化する
IOCS _SP_INIT
IOCS _SP_CGCLR
;プライオリティを設定する
; SP TX GR G3 G2 G1 G0
move.w #%00_01_10_11_10_01_00,d1
IOCS _PRIORITY
;マス目のマップを読み込む
; .ds.l 512 ;ファイルの先頭からラスタの先頭までのオフセット
; .dc.w データ,次の区切り,… ;次の区切り=-1でラスタ終わり
; :
clr.w -(sp)
pea.l board_map_nam
bsr open_file
addq.l #6,sp
tst.l d0
bmi 90f
move.l #32768,-(sp)
pea.l board_map
move.w d0,-(sp)
DOS _READ
move.l d0,(6,sp)
DOS _CLOSE
lea.l (10,sp),sp
;マス目のマップをリロケートしておく
lea.l board_map,a0
move.l a0,d1
move.w #512-1,d0
@@: add.l d1,(a0)+
dbra d0,@b
bsr init_patbuf
;スプライトパターンを定義する
move.l #NULL_PATTERN,d1 ;パターン番号
move.l #1,d2 ;0=8×8,1=16×16
lea.l (sp_null,pc),a1 ;パターンデータ
IOCS _SP_DEFCG
move.l #MASK_PATTERN,d1 ;パターン番号
move.l #1,d2 ;0=8×8,1=16×16
lea.l (sp_mask0,pc),a1 ;パターンデータ
IOCS _SP_DEFCG
move.l #MASK_PATTERN+1,d1 ;パターン番号
move.l #1,d2 ;0=8×8,1=16×16
lea.l (sp_mask1,pc),a1 ;パターンデータ
IOCS _SP_DEFCG
move.l #CURSOR_PATTERN,d1 ;パターン番号
move.l #1,d2 ;0=8×8,1=16×16
lea.l (sp_cursor,pc),a1 ;パターンデータ
IOCS _SP_DEFCG
move.l #TURN_PATTERN,d1 ;パターン番号
move.l #1,d2 ;0=8×8,1=16×16
lea.l (sp_turn,pc),a1 ;パターンデータ
IOCS _SP_DEFCG
n = 0
.irp moji,0,1,2,3,4,5,6,7,8,9
MOJI_PATTERN_&moji equ NUMBER_PATTERN+4*n
m = 0
.rept 4
move.l #MOJI_PATTERN_&moji+m,d1 ;パターン番号
move.l #1,d2 ;0=8×8,1=16×16
lea.l (spc&moji+128*m,pc),a1 ;パターンデータ
IOCS _SP_DEFCG
m = m+1
.endm
n = n+1
.endm
n = 0
.irp moji,き,け,ち,の,ス,パ,ベ,ル,レ,引,局,後,黒,手,終,勝,石,先,対,白,分,了
MOJI_PATTERN_&moji equ MOJI_PATTERN+4*n
m = 0
.rept 4
move.l #MOJI_PATTERN_&moji+m,d1 ;パターン番号
move.l #1,d2 ;0=8×8,1=16×16
lea.l (spc&moji+128*m,pc),a1 ;パターンデータ
IOCS _SP_DEFCG
m = m+1
.endm
n = n+1
.endm
;スプライトのパレットを設定する
lea.l (text_palet,pc),a0
move.l #$80000000,d4
4: move.l d4,d1 ;パレットブロック×16+パレットコード,bit31=nowait
move.l #MASK_PALETTE,d2 ;パレットブロック(0ならd1の上位4bitを使う)
moveq.l #0,d3 ;カラーコード
move.w (a0)+,d3
cmp.w #15,d4
bne @f
moveq.l #0,d3
@@: IOCS _SPALET
addq.w #1,d4
cmp.w #16,d4
blo 4b
lea.l (cursor_palet,pc),a0
move.l #$80000000,d4
4: move.l d4,d1 ;パレットブロック×16+パレットコード,bit31=nowait
move.l #CURSOR_PALETTE,d2 ;パレットブロック(0ならd1の上位4bitを使う)
moveq.l #0,d3 ;カラーコード
move.w (a0)+,d3
IOCS _SPALET
addq.w #1,d4
cmp.w #16,d4
blo 4b
n = 0
.rept 16
move.l #$80000000+n,d1 ;パレットブロック×16+パレットコード,bit31=nowait
move.l #NUMBER_PALETTE,d2 ;パレットブロック(0ならd1の上位4bitを使う)
.if n
move.l #((8+n+n/2)<<11)+((8+n+n/2)<<6)+((8+n+n/2)<<1),d3 ;カラーコード
.else
move.l #0,d3
.endif
IOCS _SPALET
n = n+1
.endm
n = 0
.rept 16
move.l #$80000000+n,d1 ;パレットブロック×16+パレットコード,bit31=nowait
move.l #WINDOW0_PALETTE,d2 ;パレットブロック(0ならd1の上位4bitを使う)
.if n
move.l #((8+n+n/2)<<11)+((8+n+n/2)<<6)+(31<<1),d3 ;カラーコード
.else
move.l #(31<<1),d3
.endif
IOCS _SPALET
n = n+1
.endm
n = 0
.rept 16
move.l #$80000000+n,d1 ;パレットブロック×16+パレットコード,bit31=nowait
move.l #WINDOW1_PALETTE,d2 ;パレットブロック(0ならd1の上位4bitを使う)
.if n
move.l #((8+n+n/2)<<11)+((8+n+n/2)<<6)+(31<<1),d3 ;カラーコード
.else
move.l #(31<<1),d3
.endif
IOCS _SPALET
n = n+1
.endm
;バックグラウンドを表示する
move.l #BG_PAGE,d1 ;BGページ番号
move.l #BG_TEXT,d2 ;BGテキスト番号
move.l #1,d3 ;0=OFF,1=ON
IOCS _BGCTRLST
;バックグラウンドの位置を設定する
move.l #BG_PAGE,d1 ;BGページ番号
move.l #0,d2 ;X方向スクロール
move.l #0,d3 ;Y方向スクロール
IOCS _BGSCRLST
;バックグラウンドをパターンで塗り潰す
move.l #BG_TEXT,d1 ;BGテキスト番号
move.l #MASK_PALETTE*256+NULL_PATTERN,d2 ;パレットブロック×256+パターン番号,bit14=hrev,bit15=vrev
IOCS _BGTEXTCL
;バックグラウンドのパターンを繰り抜く
.irp y,(-2),(-1),2,3
.irp x,0,1,2
move.l #BG_TEXT,d1 ;BGテキスト番号
move.l #MOJI_BLACK_X+2+x,d2 ;X座標
move.l #MOJI_BLACK_Y+y,d3 ;Y座標
.if y=(-2).or.y=(3)
move.l #MASK_PALETTE*256+MASK_PATTERN,d4 ;パレットブロック×256+パターン番号,bit14=hrev,bit15=vrev
.elseif y=(-1)
move.l #MASK_PALETTE*256+MASK_PATTERN+1,d4 ;パレットブロック×256+パターン番号,bit14=hrev,bit15=vrev
.else
move.l #$8000+MASK_PALETTE*256+MASK_PATTERN+1,d4 ;パレットブロック×256+パターン番号,bit14=hrev,bit15=vrev
.endif
IOCS _BGTEXTST
.endm
.endm
.irp y,(-2),(-1),2,3
.irp x,0,1,2
move.l #BG_TEXT,d1 ;BGテキスト番号
move.l #MOJI_WHITE_X+2+x,d2 ;X座標
move.l #MOJI_WHITE_Y+y,d3 ;Y座標
.if y=(-2).or.y=(3)
move.l #MASK_PALETTE*256+MASK_PATTERN,d4 ;パレットブロック×256+パターン番号,bit14=hrev,bit15=vrev
.elseif y=(-1)
move.l #MASK_PALETTE*256+MASK_PATTERN+1,d4 ;パレットブロック×256+パターン番号,bit14=hrev,bit15=vrev
.else
move.l #$8000+MASK_PALETTE*256+MASK_PATTERN+1,d4 ;パレットブロック×256+パターン番号,bit14=hrev,bit15=vrev
.endif
IOCS _BGTEXTST
.endm
.endm
;黒と白の文字を表示
.irp y,0,1
.irp x,0,1
move.l #BG_TEXT,d1 ;BGテキスト番号
move.l #MOJI_BLACK_X+x,d2 ;X座標
move.l #MOJI_BLACK_Y+y,d3 ;Y座標
move.l #BLACK_PALETTE*256+MOJI_PATTERN_黒+x+2*y,d4 ;パレットブロック×256+パターン番号,bit14=hrev,bit15=vrev
IOCS _BGTEXTST
.endm
.endm
.irp y,0,1
.irp x,0,1
move.l #BG_TEXT,d1 ;BGテキスト番号
move.l #MOJI_WHITE_X+x,d2 ;X座標
move.l #MOJI_WHITE_Y+y,d3 ;Y座標
move.l #WHITE_PALETTE*256+MOJI_PATTERN_白+x+2*y,d4 ;パレットブロック×256+パターン番号,bit14=hrev,bit15=vrev
IOCS _BGTEXTST
.endm
.endm
;スプライトのマウスカーソルを割り込み駆動にする
bsr super
bsr vwait
lea.l $00EB0000+8*CURSOR_SPRITE,a0
move.l #0,(a0)+ ;X座標,Y座標
.if 1
move.w #CURSOR_PALETTE*256+CURSOR_PATTERN,(a0)+
;パレットブロック×256+パターン番号,bit14=hrev,bit15=vrev
.else
move.w #NUMBER_PALETTE*256+CURSOR_PATTERN,(a0)+
;パレットブロック×256+パターン番号,bit14=hrev,bit15=vrev
.endif
move.w #3,(a0)+ ;0=表示しない,1=BG0>BG1>SP,2=BG0>SP>BG1,3=SP>BG0>BG1
move.l $09B6.w,mouse_interrupt_old_vector
move.l #mouse_interrupt_routine,$09B6.w
bsr user
;石数のウィンドウを開く
move.l #((16*MOJI_BLACK_X-8)<<16)+(16*MOJI_BLACK_Y-9),d1
move.l #((8+(512-16*MOJI_BLACK_X*2)+8-1)<<16)+(9+32+9),d2
bsr open_window
;スプライト表示開始
IOCS _SP_ON
98: moveq.l #0,d0
99: movem.l (sp)+,d1-d7/a0-a6
rts
90: moveq.l #-1,d0
bra 99b
;テキストパレット
.even
text_palet:
.dc.w %00000_00000_00000_0
.dc.w %00000_00000_11111_0
.dc.w %00000_11111_00000_0
.dc.w %11111_11111_11111_0
.rept 4
.dc.w %11011_11001_10110_0
.endm
.rept 8
.dc.w %01000_00000_10001_0
.endm
;マウスカーソルのパレット
.even
cursor_palet:
grb 0,0,0
grb 2,26,18
grb 3,24,19
grb 4,22,20
grb 5,20,21
grb 6,18,22
grb 7,16,23
grb 8,14,24
grb 9,12,25
grb 10,10,26
grb 11,8,27
grb 12,6,28
grb 13,4,29
grb 14,2,30
grb 15,0,31
grb 31,29,25
.if 0
;マウスカーソル
.even
mouse_cursor:
.dc.w 0,0 ;ホットスポット
.dc.w %0011111111111111
.dc.w %0001111111111111
.dc.w %0000111111111111
.dc.w %0000011111111111
.dc.w %0000001111111111
.dc.w %0000000111111111
.dc.w %0000000011111111
.dc.w %0000000001111111
.dc.w %0000000000111111
.dc.w %0000000000011111
.dc.w %0000000111111111
.dc.w %0001000011111111
.dc.w %0011000011111111
.dc.w %1111100001111111
.dc.w %1111100001111111
.dc.w %1111110011111111
.dc.w %0000000000000000
.dc.w %0100000000000000
.dc.w %0110000000000000
.dc.w %0111000000000000
.dc.w %0111100000000000
.dc.w %0111110000000000
.dc.w %0111111000000000
.dc.w %0111111100000000
.dc.w %0111111110000000
.dc.w %0111110000000000
.dc.w %0110110000000000
.dc.w %0100011000000000
.dc.w %0000011000000000
.dc.w %0000001100000000
.dc.w %0000001100000000
.dc.w %0000000000000000
.endif
;スプライトパターン
.align 4,$2048
sp_null:
.rept 32
.dc.l $00000000
.endm
sp_mask0:
.rept 32
.dc.l $FFFFFFFF
.endm
sp_mask1:
.dc.l $FFFFFFFF
.dc.l $FFFFFFFF
.dc.l $FFFFFFFF
.dc.l $FFFFFFFF
.dc.l $FFFFFFFF
.dc.l $FFFFFFFF
.dc.l $FFFFFFFF
.dc.l $11111111
.dc.l $11111111
.dc.l $11111111
.dc.l $33333333
.dc.l $11111111
.dc.l $11111111
.dc.l $11111111
.dc.l $11111111
.dc.l $11111111
.dc.l $FFFFFFFF
.dc.l $FFFFFFFF
.dc.l $FFFFFFFF
.dc.l $FFFFFFFF
.dc.l $FFFFFFFF
.dc.l $FFFFFFFF
.dc.l $FFFFFFFF
.dc.l $11111111
.dc.l $11111111
.dc.l $11111111
.dc.l $33333333
.dc.l $11111111
.dc.l $11111111
.dc.l $11111111
.dc.l $11111111
.dc.l $11111111
sp_cursor:
.if 1
.dc.l $FF000000
.dc.l $F1F00000
.dc.l $F11F0000
.dc.l $F222F000
.dc.l $F2333F00
.dc.l $F33444F0
.dc.l $F444555F
.dc.l $F4555666
.dc.l $F5566677
.dc.l $F66677FF
.dc.l $F67F78F0
.dc.l $F7F0F89F
.dc.l $FF00F99F
.dc.l $00000FAA
.dc.l $00000FBB
.dc.l $000000FF
.dc.l $00000000
.dc.l $00000000
.dc.l $00000000
.dc.l $00000000
.dc.l $00000000
.dc.l $00000000
.dc.l $00000000
.dc.l $F0000000
.dc.l $7F000000
.dc.l $FFF00000
.dc.l $00000000
.dc.l $00000000
.dc.l $00000000
.dc.l $F0000000
.dc.l $F0000000
.dc.l $00000000
.elseif 1
;パレットブロック0で普通のテキストのマウスカーソルと同じになるパターン
.dc.l $44000000
.dc.l $4C400000
.dc.l $4CC40000
.dc.l $4CCC4000
.dc.l $4CCCC400
.dc.l $4CCCCC40
.dc.l $4CCCCCC4
.dc.l $4CCCCCCC
.dc.l $4CCCCCCC
.dc.l $4CCCCC44
.dc.l $4CC4CC40
.dc.l $4C404CC4
.dc.l $44004CC4
.dc.l $000004CC
.dc.l $000004CC
.dc.l $00000044
.dc.l $00000000
.dc.l $00000000
.dc.l $00000000
.dc.l $00000000
.dc.l $00000000
.dc.l $00000000
.dc.l $00000000
.dc.l $40000000
.dc.l $C4000000
.dc.l $44400000
.dc.l $00000000
.dc.l $00000000
.dc.l $00000000
.dc.l $40000000
.dc.l $40000000
.dc.l $00000000
.endif
sp_turn:
.dc.l $22222222
.dc.l $22222222
.dc.l $00000000
.dc.l $00000000
.dc.l $00000000
.dc.l $00000000
.dc.l $00000000
.dc.l $00000000
.dc.l $00000000
.dc.l $00000000
.dc.l $00000000
.dc.l $00000000
.dc.l $00000000
.dc.l $00000000
.dc.l $00000000
.dc.l $00000000
.dc.l $22222222
.dc.l $22222222
.dc.l $00000000
.dc.l $00000000
.dc.l $00000000
.dc.l $00000000
.dc.l $00000000
.dc.l $00000000
.dc.l $00000000
.dc.l $00000000
.dc.l $00000000
.dc.l $00000000
.dc.l $00000000
.dc.l $00000000
.dc.l $00000000
.dc.l $00000000
.irp moji,0,1,2,3,4,5,6,7,8,9
spc&moji: .insert sp/&moji.sp
.endm
.irp moji,き,け,ち,の,ス,パ,ベ,ル,レ,引,局,後,黒,手,終,勝,石,先,対,白,分,了
spc&moji: .insert sp/&moji.sp
.endm
board_map_nam: .dc.b 'GREVDATA/BOARD.MAP',0
.data
.align 4
mouse_interrupt_old_vector: .dc.l 0
.bss
;ボードマップ
; .ds.l 512 ;ラスタの先頭
; .dc.w データ,次の区切り,… ;次の区切り=-1でラスタ終わり
; :
.align 4
board_map: .ds.b 32768
;----------------------------------------------------------------
;画面の後始末
.text
.align 4,$2048
tini_screen::
movem.l d1-d7/a0-a6,-(sp)
;マウスの割り込み処理を元に戻す
move.l mouse_interrupt_old_vector,d0
ble @f
bsr super
move.l d0,$09B6.w
bsr user
@@:
IOCS _B_CURON
IOCS _MS_CUROF
IOCS _MS_INIT
moveq.l #-1,d1
moveq.l #0,d2
IOCS _SKEY_MOD
moveq.l #0,d0
moveq.l #16,d1
IOCS _CRTMOD
move.l #(14<<16)+0,-(sp)
DOS _CONCTRL
addq.l #4,sp
moveq.l #0,d0
movem.l (sp)+,d1-d7/a0-a6
rts
;----------------------------------------------------------------
;マウス処理の割り込みルーチン
.text
.align 4,$2048
mouse_interrupt_routine:
move.l a0,-(sp)
movea.l mouse_interrupt_old_vector,a0
jsr (a0)
movea.l $0ACE.w,a0 ;マウスカーソルの座標
adda.l #((16-CURSOR_HOT_X)<<16)+(16-CURSOR_HOT_Y),a0 ;座標を補正する
move.l a0,$00EB0000+8*CURSOR_SPRITE ;スプライトの座標
movea.l (sp)+,a0
rts
;----------------------------------------------------------------
;2桁のカウンタを表示する
;<d0.l:(d<<16)+N,N=0~99,d=0~31
;<d1.l:スプライト番号の先頭(スプライトを12個使用する)
;<d2.l:X座標
;<d3.l:Y座標
;<d4.l:パレットブロック
;<d5.l:0=表示しない,1=BG0>BG1>SP,2=BG0>SP>BG1,3=SP>BG0>BG1
.text
.align 4,$2048
drawnum2:
movem.l d0-d5/d7,-(sp)
move.l d0,d7
moveq.l #-1,d0
@@: sub.w #10,d7
dbcs d0,@b
not.l d0 ;10の位
add.w #10,d7 ;1の位
cmp.w #9,d7
blo @f
swap.w d0
swap.w d7
move.w d7,d0
swap.w d0
swap.w d7
@@: bsr drawnum1s
move.l d7,d0
addq.w #6,d1 ;スプライト番号の先頭
add.w #NUMBER_WIDTH,d2 ;X座標
bsr drawnum1
movem.l (sp)+,d0-d5/d7
rts
;----------------------------------------------------------------
;数字を1つ表示する
;<d0.l:(d<<16)+N,N=0~9,d=0~31
;<d1.l:スプライト番号の先頭(スプライトを6個使用する)
;<d2.l:X座標
;<d3.l:Y座標
;<d4.l:パレットブロック
;<d5.l:0=表示しない,1=BG0>BG1>SP,2=BG0>SP>BG1,3=SP>BG0>BG1
.text
.align 4,$2048
drawnum1:
movem.l d0-d5,-(sp)
bset.l #31,d1
add.w #16,d2
add.w #16,d3
lsl.w #8,d4
add.b d0,d0
add.b d0,d0
add.b #NUMBER_PATTERN,d0
move.b d0,d4
swap.w d0
sub.w d0,d3
;<d0.w:d
;<d1.l:スプライト番号,bit31=nowait
;<d2.l:X座標+16
;<d3.l:Y座標+16
;<d4.l:パレットブロック×256+パターン番号,bit14=hrev,bit15=vrev
;<d5.l:0=表示しない,1=BG0>BG1>SP,2=BG0>SP>BG1,3=SP>BG0>BG1
cmp.w #16,d0
bcc 10f
movem.l d0-d5,-(sp)
IOCS _SP_REGST
movem.l (sp)+,d0-d5
addq.w #1,d1
add.w #16,d2
movem.l d0-d5,-(sp)
addq.b #1,d4
IOCS _SP_REGST
movem.l (sp)+,d0-d5
addq.w #1,d1
sub.w #16,d2
10:
add.w #16,d3
addq.b #2,d4
movem.l d0-d5,-(sp)
IOCS _SP_REGST
movem.l (sp)+,d0-d5
addq.w #1,d1
add.w #16,d2
movem.l d0-d5,-(sp)
addq.b #1,d4
IOCS _SP_REGST
movem.l (sp)+,d0-d5
tst.w d0
beq 90f
addq.w #1,d1
sub.w #16,d2
add.w #16,d3
addq.b #2,d4
cmp.b #NUMBER_PATTERN+4*10,d4
bcs @f
sub.b #4*10,d4
@@:
movem.l d0-d5,-(sp)
IOCS _SP_REGST
movem.l (sp)+,d0-d5
addq.w #1,d1
add.w #16,d2
movem.l d0-d5,-(sp)
addq.b #1,d4
IOCS _SP_REGST
movem.l (sp)+,d0-d5
cmp.w #16,d0
blo 99f
beq 90f
addq.w #1,d1
sub.w #16,d2
add.w #16,d3
addq.b #2,d4
cmp.b #NUMBER_PATTERN+4*10,d4
bcs @f
sub.b #4*10,d4
@@:
movem.l d1-d5,-(sp)
IOCS _SP_REGST
movem.l (sp)+,d1-d5
addq.w #1,d1
add.w #16,d2
addq.b #1,d4
IOCS _SP_REGST
99:
movem.l (sp)+,d0-d5
rts
90:
addq.w #1,d1
move.l #0,d2
move.l #0,d3
move.l #0,d4
move.l #0,d5
move.l d1,-(sp)
IOCS _SP_REGST
move.l (sp)+,d1
addq.w #1,d1
move.l #0,d2
move.l #0,d3
move.l #0,d4
move.l #0,d5
IOCS _SP_REGST
bra 99b
;----------------------------------------------------------------
;数字を1つ表示する(0は空白になる)
;<d0.l:(d<<16)+N,N=0~9,d=0~31
;<d1.l:スプライト番号の先頭(スプライトを6個使用する)
;<d2.l:X座標
;<d3.l:Y座標
;<d4.l:パレットブロック
;<d5.l:0=表示しない,1=BG0>BG1>SP,2=BG0>SP>BG1,3=SP>BG0>BG1
.text
.align 4,$2048
drawnum1s:
movem.l d0-d5,-(sp)
bset.l #31,d1
add.w #16,d2
add.w #16,d3
lsl.w #8,d4
add.b d0,d0
add.b d0,d0
add.b #NUMBER_PATTERN,d0
move.b d0,d4
swap.w d0
sub.w d0,d3
;<d0.w:d
;<d1.l:スプライト番号,bit31=nowait
;<d2.l:X座標+16
;<d3.l:Y座標+16
;<d4.l:パレットブロック×256+パターン番号,bit14=hrev,bit15=vrev
;<d5.l:0=表示しない,1=BG0>BG1>SP,2=BG0>SP>BG1,3=SP>BG0>BG1
cmp.w #16,d0
bcc 10f
movem.l d0-d5,-(sp)
cmp.b #NUMBER_PATTERN+4,d4
bcc @f
moveq.l #0,d2
moveq.l #0,d3
moveq.l #0,d4
moveq.l #0,d5
@@:
IOCS _SP_REGST
movem.l (sp)+,d0-d5
addq.w #1,d1
add.w #16,d2
movem.l d0-d5,-(sp)
addq.b #1,d4
cmp.b #NUMBER_PATTERN+4,d4
bcc @f
moveq.l #0,d2
moveq.l #0,d3
moveq.l #0,d4
moveq.l #0,d5
@@:
IOCS _SP_REGST
movem.l (sp)+,d0-d5
addq.w #1,d1
sub.w #16,d2
10:
add.w #16,d3
addq.b #2,d4
movem.l d0-d5,-(sp)
cmp.b #NUMBER_PATTERN+4,d4
bcc @f
moveq.l #0,d2
moveq.l #0,d3
moveq.l #0,d4
moveq.l #0,d5
@@:
IOCS _SP_REGST
movem.l (sp)+,d0-d5
addq.w #1,d1
add.w #16,d2
movem.l d0-d5,-(sp)
addq.b #1,d4
cmp.b #NUMBER_PATTERN+4,d4
bcc @f
moveq.l #0,d2
moveq.l #0,d3
moveq.l #0,d4
moveq.l #0,d5
@@:
IOCS _SP_REGST
movem.l (sp)+,d0-d5
tst.w d0
beq 90f
addq.w #1,d1
sub.w #16,d2
add.w #16,d3
addq.b #2,d4
cmp.b #NUMBER_PATTERN+4*10,d4
bcs @f
sub.b #4*10,d4
@@:
movem.l d0-d5,-(sp)
IOCS _SP_REGST
movem.l (sp)+,d0-d5
addq.w #1,d1
add.w #16,d2
movem.l d0-d5,-(sp)
addq.b #1,d4
IOCS _SP_REGST
movem.l (sp)+,d0-d5
cmp.w #16,d0
blo 99f
beq 90f
addq.w #1,d1
sub.w #16,d2
add.w #16,d3
addq.b #2,d4
cmp.b #NUMBER_PATTERN+4*10,d4
bcs @f
sub.b #4*10,d4
@@:
movem.l d1-d5,-(sp)
IOCS _SP_REGST
movem.l (sp)+,d1-d5
addq.w #1,d1
add.w #16,d2
addq.b #1,d4
IOCS _SP_REGST
99:
movem.l (sp)+,d0-d5
rts
90:
addq.w #1,d1
move.l #0,d2
move.l #0,d3
move.l #0,d4
move.l #0,d5
move.l d1,-(sp)
IOCS _SP_REGST
move.l (sp)+,d1
addq.w #1,d1
move.l #0,d2
move.l #0,d3
move.l #0,d4
move.l #0,d5
IOCS _SP_REGST
bra 99b
;----------------------------------------------------------------
;ゲームの初期化
.text
.align 4,$2048
init_graph::
movem.l d1-d7/a0-a6,-(sp)
clr.w -(sp)
pea.l board_gl3_nam
bsr open_file
addq.l #6,sp
tst.l d0
bmi 90f
move.l #2*512*512,-(sp)
pea.l $00C00000
move.w d0,-(sp)
DOS _READ
move.l d0,(6,sp)
DOS _CLOSE
addq.l #6,sp
cmpi.l #2*512*512,(sp)+
bne 90f
lea.l board_stat_table,a0
moveq.l #-1,d0
moveq.l #64-1,d1
1: move.l d0,(a0)+
dbra d1,1b
clr.l black_count
clr.l white_count
98: moveq.l #0,d0
99: movem.l (sp)+,d1-d7/a0-a6
rts
90: moveq.l #-1,d0
bra 99b
board_gl3_nam: .dc.b 'GREVDATA/BOARD.GL3',0
.bss
.align 4
black_count: .ds.l 1
white_count: .ds.l 1
;----------------------------------------------------------------
;0:32
ratio_0 .macro dx,dy,tx,ty
moveq.l #0,dx ;A×0
lsl.l #5,dy ;B×32
.endm
;----------------------------------------------------------------
;1:31
ratio_1 .macro dx,dy,tx,ty
move.l dy,ty ;B×1
lsl.l #5,dy ;B×32
sub.l ty,dy ;B×31
.endm
;----------------------------------------------------------------
;2:30
ratio_2 .macro dx,dy,tx,ty
move.l dy,ty ;B×1
lsl.l #4,dy ;B×16
lsl.l #1,dx ;A×2
sub.l ty,dy ;B×15
lsl.l #1,dy ;B×30
.endm
;----------------------------------------------------------------
;3:29
ratio_3 .macro dx,dy,tx,ty
move.l dy,ty ;B×1
lsl.l #3,dy ;B×8
move.l dx,tx ;A×1
sub.l ty,dy ;B×7
lsl.l #1,dx ;A×2
lsl.l #2,dy ;B×28
add.l tx,dx ;A×3
add.l ty,dy ;B×29
.endm
;----------------------------------------------------------------
;4:28
ratio_4 .macro dx,dy,tx,ty
move.l dy,ty ;B×1
lsl.l #3,dy ;B×8
lsl.l #2,dx ;A×4
sub.l ty,dy ;B×7
lsl.l #2,dy ;B×28
.endm
;----------------------------------------------------------------
;5:27
ratio_5 .macro dx,dy,tx,ty
move.l dy,ty ;B×1
lsl.l #3,dy ;B×8
move.l dx,tx ;A×1
sub.l ty,dy ;B×7
lsl.l #2,dx ;A×4
lsl.l #2,dy ;B×28
add.l tx,dx ;A×5
sub.l ty,dy ;B×27
.endm
;----------------------------------------------------------------
;6:26
ratio_6 .macro dx,dy,tx,ty
move.l dy,ty ;B×1
lsl.l #1,dy ;B×2
move.l dx,tx ;A×1
add.l ty,dy ;B×3
lsl.l #1,dx ;A×2
lsl.l #2,dy ;B×12
add.l tx,dx ;A×3
add.l ty,dy ;B×13
lsl.l #1,dx ;A×6
lsl.l #1,dy ;B×26
.endm
;----------------------------------------------------------------
;7:25
ratio_7 .macro dx,dy,tx,ty
move.l dy,ty ;B×1
lsl.l #1,dy ;B×2
move.l dx,tx ;A×1
add.l ty,dy ;B×3
lsl.l #3,dx ;A×8
lsl.l #3,dy ;B×24
sub.l tx,dx ;A×7
add.l ty,dy ;B×25
.endm
;----------------------------------------------------------------
;8:24
ratio_8 .macro dx,dy,tx,ty
move.l dy,ty ;B×1
lsl.l #1,dy ;B×2
lsl.l #3,dx ;A×8
add.l ty,dy ;B×3
lsl.l #3,dy ;B×24
.endm
;----------------------------------------------------------------
;9:23
ratio_9 .macro dx,dy,tx,ty
move.l dy,ty ;B×1
lsl.l #1,dy ;B×2
move.l dx,tx ;A×1
add.l ty,dy ;B×3
lsl.l #3,dx ;A×8
lsl.l #3,dy ;B×24
add.l tx,dx ;A×9
sub.l ty,dy ;B×23
.endm
;----------------------------------------------------------------
;10:22
ratio_10 .macro dx,dy,tx,ty
move.l dy,ty ;B×1
lsl.l #2,dy ;B×4
move.l dx,tx ;A×1
add.l ty,dy ;B×5
lsl.l #2,dx ;A×4
lsl.l #1,dy ;B×10
add.l tx,dx ;A×5
add.l ty,dy ;B×11
lsl.l #1,dx ;A×10
lsl.l #1,dy ;B×22
.endm
;----------------------------------------------------------------
;11:21
ratio_11 .macro dx,dy,tx,ty
move.l dx,tx ;A×1
move.l dy,ty ;B×1
lsl.l #2,dx ;A×4
lsl.l #2,dy ;B×4
add.l tx,dx ;A×5
add.l ty,dy ;B×5
lsl.l #1,dx ;A×10
lsl.l #2,dy ;B×20
add.l tx,dx ;A×11
add.l ty,dy ;B×21
.endm
;----------------------------------------------------------------
;12:20
ratio_12 .macro dx,dy,tx,ty
move.l dx,tx ;A×1
move.l dy,ty ;B×1
lsl.l #1,dx ;A×2
lsl.l #2,dy ;B×4
add.l tx,dx ;A×3
add.l ty,dy ;B×5
lsl.l #2,dx ;A×12
lsl.l #2,dy ;B×20
.endm
;----------------------------------------------------------------
;13:19
ratio_13 .macro dx,dy,tx,ty
move.l dx,tx ;A×1
move.l dy,ty ;B×1
lsl.l #1,dx ;A×2
lsl.l #3,dy ;B×8
add.l tx,dx ;A×3
add.l ty,dy ;B×9
lsl.l #2,dx ;A×12
lsl.l #1,dy ;B×18
add.l tx,dx ;A×13
add.l ty,dy ;B×19
.endm
;----------------------------------------------------------------
;14:18
ratio_14 .macro dx,dy,tx,ty
move.l dx,tx ;A×1
move.l dy,ty ;B×1
lsl.l #3,dx ;A×8
lsl.l #3,dy ;B×8
sub.l tx,dx ;A×7
add.l ty,dy ;B×9
lsl.l #1,dx ;A×14
lsl.l #1,dy ;B×18
.endm
;----------------------------------------------------------------
;15:17
ratio_15 .macro dx,dy,tx,ty
move.l dx,tx ;A×1
move.l dy,ty ;B×1
lsl.l #4,dx ;A×16
lsl.l #4,dy ;B×16
sub.l tx,dx ;A×15
add.l ty,dy ;B×17
.endm
;----------------------------------------------------------------
;16:16
ratio_16 .macro dx,dy,tx,ty
lsl.l #4,dx ;A×16
lsl.l #4,dy ;B×16
.endm
;----------------------------------------------------------------
;17:15
ratio_17 .macro dx,dy,tx,ty
move.l dx,tx ;A×1
move.l dy,ty ;B×1
lsl.l #4,dx ;A×16
lsl.l #4,dy ;B×16
add.l tx,dx ;A×17
sub.l ty,dy ;B×15
.endm
;----------------------------------------------------------------
;18:14
ratio_18 .macro dx,dy,tx,ty
move.l dx,tx ;A×1
move.l dy,ty ;B×1
lsl.l #3,dx ;A×8
lsl.l #3,dy ;B×8
add.l tx,dx ;A×9
sub.l ty,dy ;B×7
lsl.l #1,dx ;A×18
lsl.l #1,dy ;B×14
.endm
;----------------------------------------------------------------
;19:13
ratio_19 .macro dx,dy,tx,ty
move.l dx,tx ;A×1
move.l dy,ty ;B×1
lsl.l #3,dx ;A×8
lsl.l #1,dy ;B×2
add.l tx,dx ;A×9
add.l ty,dy ;B×3
lsl.l #1,dx ;A×18
lsl.l #2,dy ;B×12
add.l tx,dx ;A×19
add.l ty,dy ;B×13
.endm
;----------------------------------------------------------------
;20:12
ratio_20 .macro dx,dy,tx,ty
move.l dx,tx ;A×1
move.l dy,ty ;B×1
lsl.l #2,dx ;A×4
lsl.l #1,dy ;B×2
add.l tx,dx ;A×5
add.l ty,dy ;B×3
lsl.l #2,dx ;A×20
lsl.l #2,dy ;B×12
.endm
;----------------------------------------------------------------
;21:11
ratio_21 .macro dx,dy,tx,ty
move.l dx,tx ;A×1
move.l dy,ty ;B×1
lsl.l #2,dx ;A×4
lsl.l #2,dy ;B×4
add.l tx,dx ;A×5
add.l ty,dy ;B×5
lsl.l #2,dx ;A×20
lsl.l #1,dy ;B×10
add.l tx,dx ;A×21
add.l ty,dy ;B×11
.endm
;----------------------------------------------------------------
;22:10
ratio_22 .macro dx,dy,tx,ty
move.l dx,tx ;A×1
lsl.l #2,dx ;A×4
move.l dy,ty ;B×1
add.l tx,dx ;A×5
lsl.l #2,dy ;B×4
lsl.l #1,dx ;A×10
add.l ty,dy ;B×5
add.l tx,dx ;A×11
lsl.l #1,dy ;B×10
lsl.l #1,dx ;A×22
.endm
;----------------------------------------------------------------
;23:9
ratio_23 .macro dx,dy,tx,ty
move.l dx,tx ;A×1
lsl.l #1,dx ;A×2
move.l dy,ty ;B×1
add.l tx,dx ;A×3
lsl.l #3,dy ;B×8
lsl.l #3,dx ;A×24
add.l ty,dy ;B×9
sub.l tx,dx ;A×23
.endm
;----------------------------------------------------------------
;24:8
ratio_24 .macro dx,dy,tx,ty
move.l dx,tx ;A×1
lsl.l #1,dx ;A×2
lsl.l #3,dy ;B×8
add.l tx,dx ;A×3
lsl.l #3,dx ;A×24
.endm
;----------------------------------------------------------------
;25:7
ratio_25 .macro dx,dy,tx,ty
move.l dx,tx ;A×1
lsl.l #1,dx ;A×2
move.l dy,ty ;B×1
add.l tx,dx ;A×3
lsl.l #3,dy ;B×8
lsl.l #3,dx ;A×24
sub.l ty,dy ;B×7
add.l tx,dx ;A×25
.endm
;----------------------------------------------------------------
;26:6
ratio_26 .macro dx,dy,tx,ty
move.l dx,tx ;A×1
lsl.l #1,dx ;A×2
move.l dy,ty ;B×1
add.l tx,dx ;A×3
lsl.l #1,dy ;B×2
lsl.l #2,dx ;A×12
add.l ty,dy ;B×3
add.l tx,dx ;A×13
lsl.l #1,dy ;B×6
lsl.l #1,dx ;A×26
.endm
;----------------------------------------------------------------
;27:5
ratio_27 .macro dx,dy,tx,ty
move.l dx,tx ;A×1
lsl.l #3,dx ;A×8
move.l dy,ty ;B×1
sub.l tx,dx ;A×7
lsl.l #2,dy ;B×4
lsl.l #2,dx ;A×28
add.l ty,dy ;B×5
sub.l tx,dx ;A×27
.endm
;----------------------------------------------------------------
;28:4
ratio_28 .macro dx,dy,tx,ty
move.l dx,tx ;A×1
lsl.l #3,dx ;A×8
lsl.l #2,dy ;B×4
sub.l tx,dx ;A×7
lsl.l #2,dx ;A×28
.endm
;----------------------------------------------------------------
;29:3
ratio_29 .macro dx,dy,tx,ty
move.l dx,tx ;A×1
lsl.l #3,dx ;A×8
move.l dy,ty ;B×1
sub.l tx,dx ;A×7
lsl.l #1,dy ;B×2
lsl.l #2,dx ;A×28
add.l ty,dy ;B×3
add.l tx,dx ;A×29
.endm
;----------------------------------------------------------------
;30:2
ratio_30 .macro dx,dy,tx,ty
move.l dx,tx ;A×1
lsl.l #4,dx ;A×16
lsl.l #1,dy ;B×2
sub.l tx,dx ;A×15
lsl.l #1,dx ;A×30
.endm
;----------------------------------------------------------------
;31:1
ratio_31 .macro dx,dy,tx,ty
move.l dx,tx ;A×1
lsl.l #5,dx ;A×32
sub.l tx,dx ;A×31
.endm
;----------------------------------------------------------------
;32:0
ratio_32 .macro dx,dy,tx,ty
lsl.l #5,dx ;A×32
moveq.l #0,dy ;B×0
.endm
;----------------------------------------------------------------
;ブレンドパターン表示
; スーパーバイザモードで呼び出すこと
; パターンの幅は63ドット以内であること
; standbypat1を実行しておくこと
;<d0.l:マスの番号
;<d1.l:混合比(0~32)
.text
.align 4,$2048
blendpat1:
movem.l d1-d7/a0-a5,-(sp)
lea.l (blend_table,pc),a5
add.w d1,d1
add.w d1,d1
movea.l (a5,d1.w),a5 ;ブレンド表示ルーチンのアドレス
;d0=マスの番号
move.l d0,d2 ;d2=マスの番号
lea.l board_stat_table,a0
add.w d0,d0
add.w d0,d0
adda.l d0,a0 ;a0=board_stat_table上のアドレス
move.l (a0),d1 ;d1=マスの現在のパターン番号
bmi 90f ;パターンが表示されていない
lea.l gram_save_area,a1
.if GRAM_SAVE_SEPARATELY
add.w d0,d0
add.w d0,d0
lsl.l #8,d0 ;マスの番号×4096
adda.l d0,a1 ;a1=GRAMセーブエリアのアドレス
.endif
move.l d2,d0 ;マスの番号
bsr load_pat
bmi 90f
movea.l d0,a0 ;マスのパターンテーブルの先頭
add.w d1,d1
add.w d1,d1
adda.l (a0,d1.w),a0 ;パターンデータの先頭
move.w (a0)+,d0 ;ymin
add.w #$00C0<<6,d0
swap.w d0
clr.w d0
lsr.l #6,d0
movea.l d0,a2 ;a2=ラスタの左端のアドレス
move.w (a0)+,d1 ;ylen-1
move.w d1,d0
add.w d0,d0
add.w d0,d0
lea.l (4,a0,d0.w),a4 ;a4=パターンのアドレス
move.l #%0000010000000000_1000000000100000,d6
move.l #%0000011111000000_1111100000111110,d7
jsr (a5)
moveq.l #0,d0
99: movem.l (sp)+,d1-d7/a0-a5
rts
90: moveq.l #-1,d0
bra 99b
.align 4,$2048
blend_table:
.irp %n,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32
.dc.l blend_%n
.endm
;<d1.w:ylen-1
;<d6.l:%0000010000000000_1000000000100000
;<d7.l:%0000011111000000_1111100000111110
;<a0.l:リージョンデータ(xmin(y),xlen(y)-1,…)の先頭
;<a1.l:GRAMセーブエリアのアドレス
;<a2.l:GRAMのラスタの先頭
;<a4.l:パターンのアドレス
.irp %n,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32
.align 4,$2048
blend_%n:
bsr keyctrl_vwait
1: move.w (a0)+,d0 ;xmin(y)
add.w d0,d0
lea.l (a2,d0.w),a3 ;a3=GRAM上のアドレス
move.w (a0)+,d0 ;xlen(y)-1
@@:
move.w (a4)+,d2 ;0000000000000000gggggrrrrrbbbbb0
move.w (a1)+,d3 ;0000000000000000gggggrrrrrbbbbb0
move.w d2,d4
move.w d3,d5
swap d2 ;gggggrrrrrbbbbb0_0000000000000000
swap d3 ;gggggrrrrrbbbbb0_0000000000000000
move.w d4,d2 ;gggggrrrrrbbbbb0_gggggrrrrrbbbbb0
move.w d5,d3 ;gggggrrrrrbbbbb0_gggggrrrrrbbbbb0
and.l d7,d2 ;00000rrrrr000000_ggggg00000bbbbb0
and.l d7,d3 ;00000rrrrr000000_ggggg00000bbbbb0
ratio_%n d2,d3,d4,d5 ;比率を設定する
add.l d3,d2 ;rrrrrrrrrr0ggggg_gggggbbbbbbbbbb0
add.l d6,d2
lsr.l #5,d2
and.l d7,d2 ;00000rrrrr000000_ggggg00000bbbbb0
move.w d2,d3
swap d2 ;ggggg00000bbbbb0_00000rrrrr000000
or.w d3,d2 ;ggggg00000bbbbb0_gggggrrrrrbbbbb0
move.w d2,(a3)+
dbra d0,@b
lea.l (1024,a2),a2 ;次のラスタへ
dbra d1,1b
rts
.endm
.if 0
;----------------------------------------------------------------
;パターン消去
; スーパーバイザモードで呼び出すこと
; パターンの幅は63ドット以内であること
;<d0.l:マスの番号
.text
.align 4,$2048
erasepat1:
movem.l d1-d2/a0-a3,-(sp)
;d0=マスの番号
move.l d0,d2 ;d2=マスの番号
lea.l board_stat_table,a0
add.w d0,d0
add.w d0,d0
adda.l d0,a0 ;a0=board_stat_table上のアドレス
move.l (a0),d1 ;d1=マスの現在のパターン番号
bmi 90f ;パターンが表示されていない
lea.l gram_save_area,a1
.if GRAM_SAVE_SEPARATELY
add.w d0,d0
add.w d0,d0
lsl.l #8,d0 ;マスの番号×4096
adda.l d0,a1 ;a0=GRAMセーブエリアのアドレス
.endif
move.l d2,d0 ;マスの番号
bsr load_pat
bmi 90f
move.l #-1,(a0) ;board_stat_tableから消去
movea.l d0,a0 ;マスのパターンテーブルの先頭
add.w d1,d1
add.w d1,d1
adda.l (a0,d1.w),a0 ;パターンデータの先頭
move.w (a0)+,d0 ;ymin
add.w #$00C0<<6,d0
swap.w d0
clr.w d0
lsr.l #6,d0
movea.l d0,a2 ;a2=ラスタの左端のアドレス
move.w (a0)+,d1 ;ylen-1
bsr keyctrl_vwait
1: move.w (a0)+,d0 ;xmin(y)
add.w d0,d0
lea.l (a2,d0.w),a3 ;GRAM上のX方向開始アドレス
move.w (a0)+,d0 ;xlen(y)-1
.if 0
@@: move.w (a1)+,(a3)+ ;バッファ→GRAM
dbra d0,@b
.else
; 0 1 2 3 4
neg.w d0 ; 0 -1 -2 -3 -4
add.w d0,d0 ; 0 -2 -4 -6 -8
jmp (@f,pc,d0.w)
.rept 63-1
move.w (a1)+,(a3)+ ;バッファ→GRAM
.endm
@@: move.w (a1)+,(a3)+ ;バッファ→GRAM
.endif
lea.l (1024,a2),a2 ;次のラスタへ
dbra d1,1b
moveq.l #0,d0
99: movem.l (sp)+,d1-d2/a0-a3
rts
90: moveq.l #-1,d0
bra 99b
.endif
;----------------------------------------------------------------
;パターンアニメ
; スーパーバイザモードで呼び出すこと
; パターンの幅は63ドット以内であること
;<d0.l:マスの番号
;<d1.l:パターンの番号
.text
.align 4,$2048
animpat1:
movem.l d2-d3/a0,-(sp)
move.l d0,d2 ;d0=マスの番号
;d2=マスの番号
lea.l board_stat_table,a0
add.w d0,d0
add.w d0,d0
adda.l d0,a0 ;a0=board_stat_table上のアドレス
move.l (a0),d0 ;d0=マスの現在のパターン番号
bpl @f
;何も表示されていなかったときは1枚だけ表示する
move.l d2,d0 ;d0=マスの番号
bsr drawpat1
bra 98f
;既に表示されていたのでアニメーションを行う
@@: cmp.l d0,d1
beq 98f
blt 20f
;黒→白
tst.b turn_com
bne 10f
;黒→白,人間の手番なので手前に向かって回転
move.w #32,black_count
subq.w #1,black_count+2
moveq.l #0,d3
3: move.l d2,d0
move.l d3,d1
bsr drawpat1
subq.w #1,black_count
addq.w #1,white_count
bsr draw_black_count
bsr draw_white_count
addq.w #1,d3
cmp.w #36,d3
bls 3b
clr.w black_count
clr.w white_count
addq.w #1,white_count+2
bsr draw_white_count
bra 98f
;黒→白,コンピュータの手番なので奥に向かって回転
10: move.w #32,black_count
subq.w #1,black_count+2
moveq.l #71,d3
3: move.l d2,d0
move.l d3,d1
bsr drawpat1
subq.w #1,black_count
addq.w #1,white_count
bsr draw_black_count
bsr draw_white_count
subq.w #1,d3
cmp.w #36,d3
bhs 3b
clr.w black_count
clr.w white_count
addq.w #1,white_count+2
bsr draw_white_count
bra 98f
;白→黒
20: tst.b turn_com
bne 30f
;白→黒,人間の手番なので手前に向かって回転
move.w #32,white_count
subq.w #1,white_count+2
moveq.l #37,d3
3: move.l d2,d0
move.l d3,d1
bsr drawpat1
addq.w #1,black_count
subq.w #1,white_count
bsr draw_black_count
bsr draw_white_count
addq.w #1,d3
cmp.w #71,d3
bls 3b
move.l d2,d0
moveq.l #0,d1
bsr drawpat1
clr.w black_count
addq.w #1,black_count+2
clr.w white_count
bsr draw_black_count
bra 98f
;白→黒,コンピュータの手番なので奥に向かって回転
30: move.w #32,white_count
subq.w #1,white_count+2
moveq.l #35,d3
3: move.l d2,d0
move.l d3,d1
bsr drawpat1
addq.w #1,black_count
subq.w #1,white_count
bsr draw_black_count
bsr draw_white_count
subq.w #1,d3
bhs 3b
clr.w black_count
addq.w #1,black_count+2
clr.w white_count
bsr draw_black_count
bra 98f
98: moveq.l #0,d0
99: movem.l (sp)+,d2-d3/a0
rts
;----------------------------------------------------------------
;パターン表示準備(GRAMからバッファへのセーブだけ行い,GRAMへの書き込みは行わない)
; スーパーバイザモードで呼び出すこと
; パターンの幅は63ドット以内であること
;<d0.l:マスの番号
;<d1.l:パターンの番号
.text
.align 4,$2048
standbypat1:
movem.l d1-d2/a0-a4,-(sp)
;d0=マスの番号
move.l d0,d2 ;d2=マスの番号
lea.l board_stat_table,a0
add.w d0,d0
add.w d0,d0
adda.l d0,a0 ;a0=board_stat_table上のアドレス
lea.l gram_save_area,a1
.if GRAM_SAVE_SEPARATELY
add.w d0,d0
add.w d0,d0
lsl.l #8,d0 ;マスの番号×4096
adda.l d0,a1 ;a1=GRAMセーブエリアのアドレス
.endif
.if 0
tst.l (a0)
bmi 10f ;パターンが表示されていない
cmp.l (a0),d1
beq 98f ;指定されたパターンが既に表示されている
movem.l d0-d2/a0-a1,-(sp)
move.l (a0),d1 ;d1=マスの現在のパターン番号
move.l d2,d0 ;マスの番号
bsr load_pat
bmi 95f
movea.l d0,a0 ;マスのパターンテーブルの先頭
add.w d1,d1
add.w d1,d1
adda.l (a0,d1.w),a0 ;パターンデータの先頭
move.w (a0)+,d0 ;ymin
add.w #$00C0<<6,d0
swap.w d0
clr.w d0
lsr.l #6,d0
movea.l d0,a2 ;a2=ラスタの左端のアドレス
move.w (a0)+,d1 ;ylen-1
1: move.w (a0)+,d0 ;xmin(y)
add.w d0,d0
lea.l (a2,d0.w),a3 ;GRAM上のX方向開始アドレス
move.w (a0)+,d0 ;xlen(y)-1
.if 0
@@: move.w (a1)+,(a3)+
dbra d0,@b
.else
; 0 1 2 3 4
neg.w d0 ; 0 -1 -2 -3 -4
add.w d0,d0 ; 0 -2 -4 -6 -8
jmp (@f,pc,d0.w)
.rept 63-1
move.w (a1)+,(a3)+
.endm
@@: move.w (a1)+,(a3)+
.endif
lea.l (1024,a2),a2 ;次のラスタへ
dbra d1,1b
movem.l (sp)+,d0-d2/a0-a1
10:
.endif
move.l d1,(a0) ;新しいパターンの番号
move.l d2,d0 ;マスの番号
bsr load_pat
bmi 90f
movea.l d0,a0 ;マスのパターンテーブルの先頭
add.w d1,d1
add.w d1,d1
adda.l (a0,d1.w),a0 ;パターンデータの先頭
move.w (a0)+,d0 ;ymin
add.w #$00C0<<6,d0
swap.w d0
clr.w d0
lsr.l #6,d0
movea.l d0,a2 ;a2=ラスタの左端のアドレス
move.w (a0)+,d1 ;ylen-1
move.w d1,d0
add.w d0,d0
add.w d0,d0 ;リージョンデータの長さ-4
lea.l (4,a0,d0.w),a4 ;a4=色データの先頭
1: move.w (a0)+,d0 ;xmin(y)
add.w d0,d0
lea.l (a2,d0.w),a3 ;GRAM上のX方向開始アドレス
move.w (a0)+,d0 ;xlen(y)-1
.if 0
@@: move.w (a3)+,(a1)+
dbra d0,@b
.else
; 0 1 2 3 4
neg.w d0 ; 0 -1 -2 -3 -4
add.w d0,d0 ; 0 -2 -4 -6 -8
jmp (@f,pc,d0.w)
.rept 63-1
move.w (a3)+,(a1)+ ;GRAM→バッファ
.endm
@@: move.w (a3)+,(a1)+ ;GRAM→バッファ
.endif
lea.l (1024,a2),a2 ;次のラスタへ
dbra d1,1b
98: moveq.l #0,d0
99: movem.l (sp)+,d1-d2/a0-a4
rts
95: movem.l (sp)+,d0-d2/a0-a1
90: moveq.l #-1,d0
bra 99b
;----------------------------------------------------------------
;パターン表示
; スーパーバイザモードで呼び出すこと
; パターンの幅は63ドット以内であること
;<d0.l:マスの番号
;<d1.l:パターンの番号
.text
.align 4,$2048
drawpat1:
movem.l d1-d2/d7/a0-a4,-(sp)
moveq.l #0,d7
;d0=マスの番号
move.l d0,d2 ;d2=マスの番号
lea.l board_stat_table,a0
add.w d0,d0
add.w d0,d0
adda.l d0,a0 ;a0=board_stat_table上のアドレス
lea.l gram_save_area,a1
.if GRAM_SAVE_SEPARATELY
add.w d0,d0
add.w d0,d0
lsl.l #8,d0 ;マスの番号×4096
adda.l d0,a1 ;a1=GRAMセーブエリアのアドレス
.endif
tst.l (a0)
bmi 10f ;パターンが表示されていない
cmp.l (a0),d1
beq 98f ;指定されたパターンが既に表示されている
movem.l d0-d2/a0-a1,-(sp)
move.l (a0),d1 ;d1=マスの現在のパターン番号
move.l d2,d0 ;マスの番号
bsr load_pat
bmi 95f
movea.l d0,a0 ;マスのパターンテーブルの先頭
add.w d1,d1
add.w d1,d1
adda.l (a0,d1.w),a0 ;パターンデータの先頭
move.w (a0)+,d0 ;ymin
add.w #$00C0<<6,d0
swap.w d0
clr.w d0
lsr.l #6,d0
movea.l d0,a2 ;a2=ラスタの左端のアドレス
move.w (a0)+,d1 ;ylen-1
bsr keyctrl_vwait
st.b d7
1: move.w (a0)+,d0 ;xmin(y)
add.w d0,d0
lea.l (a2,d0.w),a3 ;GRAM上のX方向開始アドレス
move.w (a0)+,d0 ;xlen(y)-1
.if 0
@@: move.w (a1)+,(a3)+
dbra d0,@b
.else
; 0 1 2 3 4
neg.w d0 ; 0 -1 -2 -3 -4
add.w d0,d0 ; 0 -2 -4 -6 -8
jmp (@f,pc,d0.w)
.rept 63-1
move.w (a1)+,(a3)+
.endm
@@: move.w (a1)+,(a3)+
.endif
lea.l (1024,a2),a2 ;次のラスタへ
dbra d1,1b
movem.l (sp)+,d0-d2/a0-a1
10: move.l d1,(a0) ;新しいパターンの番号
move.l d2,d0 ;マスの番号
bsr load_pat
bmi 90f
movea.l d0,a0 ;マスのパターンテーブルの先頭
add.w d1,d1
add.w d1,d1
adda.l (a0,d1.w),a0 ;パターンデータの先頭
move.w (a0)+,d0 ;ymin
add.w #$00C0<<6,d0
swap.w d0
clr.w d0
lsr.l #6,d0
movea.l d0,a2 ;a2=ラスタの左端のアドレス
move.w (a0)+,d1 ;ylen-1
move.w d1,d0
add.w d0,d0
add.w d0,d0 ;リージョンデータの長さ-4
lea.l (4,a0,d0.w),a4 ;a4=色データの先頭
tst.b d7
bne @f
bsr keyctrl_vwait
@@:
1: move.w (a0)+,d0 ;xmin(y)
add.w d0,d0
lea.l (a2,d0.w),a3 ;GRAM上のX方向開始アドレス
move.w (a0)+,d0 ;xlen(y)-1
@@: move.w (a3),(a1)+ ;GRAM→バッファ
move.w (a4)+,(a3)+ ;パターン→GRAM
dbra d0,@b
lea.l (1024,a2),a2 ;次のラスタへ
dbra d1,1b
98: moveq.l #0,d0
99: movem.l (sp)+,d1-d2/d7/a0-a4
rts
95: movem.l (sp)+,d0-d2/a0-a1
90: moveq.l #-1,d0
bra 99b
;----------------------------------------------------------------
;パターン番号の取得
;<d0.l:マスの番号
;>d0.l:パターン番号(-1=パターンなし)
.text
.align 4,$2048
getpat1:
movem.l a0,-(sp)
;d0=マスの番号
lea.l board_stat_table,a0
add.w d0,d0
add.w d0,d0
adda.l d0,a0 ;a0=board_stat_table上のアドレス
move.l (a0),d0
movem.l (sp)+,a0
rts
;----------------------------------------------------------------
;ボードの各マスの状態(-1=空き,0~71=パターン番号)
.bss
.align 4
board_stat_table: .ds.l 64
;----------------------------------------------------------------
;GRAMセーブエリア
.bss
.even
gram_save_area:
.if GRAM_SAVE_SEPARATELY
.ds.b GRAM_SAVE_AREA_SIZE*64
.else
.ds.b GRAM_SAVE_AREA_SIZE
.endif
;----------------------------------------------------------------
;パターン表示
; スーパーバイザモードで呼び出すこと
; パターンの幅は63ドット以内であること
;<a0.l:パターンの先頭
; .ds.w 2 ;ymin,ylen-1
; .ds.w 2*ylen ;xmin(y),xlen(y)-1
; .ds.w xlen(0) ;color
; :
; .ds.w xlen(ylen-1)
;?d0-d1/a0-a3
.text
.align 4,$2048
drawpat0:
move.w (a0)+,d0 ;ymin
add.w #$00C0<<6,d0
swap.w d0
clr.w d0
lsr.l #6,d0
movea.l d0,a2 ;a2=ラスタの左端のアドレス
move.w (a0)+,d1 ;ylen-1
move.w d1,d0
add.w d0,d0
add.w d0,d0 ;リージョンデータの長さ-4
lea.l (4,a0,d0.w),a1 ;a1=色データの先頭
bsr keyctrl_vwait
1: move.w (a0)+,d0 ;xmin(y)
add.w d0,d0
lea.l (a2,d0.w),a3 ;GRAM上のX方向開始アドレス
move.w (a0)+,d0 ;xlen(y)-1
.if 0
@@: move.w (a1)+,(a3)+
dbra d0,@b
.else
; 0 1 2 3 4
neg.w d0 ; 0 -1 -2 -3 -4
add.w d0,d0 ; 0 -2 -4 -6 -8
jmp (@f,pc,d0.w)
.rept 63-1
move.w (a1)+,(a3)+
.endm
@@: move.w (a1)+,(a3)+
.endif
lea.l (1024,a2),a2 ;次のラスタへ
dbra d1,1b
rts
;----------------------------------------------------------------
;パターンデータのバッファを初期化する
.text
.align 4,$2048
init_patbuf:
move.l #-1,patbuf_cur_num
rts
;----------------------------------------------------------------
;パターンデータを読み込む
;<d0.l:マス目の番号(0~64)
;>d0.l:パターンバッファの先頭,-1=エラー
.text
.align 4,$2048
load_pat:
cmp.l patbuf_cur_num,d0
beq 98f
move.l d0,patbuf_cur_num
add.w d0,d0
move.w (patnam_tbl,pc,d0.w),d0
clr.w -(sp)
pea.l (patnam_tbl,pc,d0.w)
bsr open_file
addq.l #6,sp
tst.l d0
bmi 90f
move.l #PATBUF_SIZE_UNIT,-(sp)
pea.l patbuf
move.w d0,-(sp)
DOS _READ
move.l d0,(6,sp)
DOS _CLOSE
addq.l #6,sp
move.l (sp)+,d0
bmi 90f
98: move.l #patbuf,d0
99: rts
90: moveq.l #-1,d0
move.l d0,patbuf_cur_num
bra 99b
.even
patnam_tbl:
.irpc y,01234567
.irpc x,01234567
.dc.w patnam_&y&&x-patnam_tbl
.endm
.endm
.irpc y,01234567
.irpc x,01234567
patnam_&y&&x: .dc.b 'GREVDATA/','0'+x,'0'+y,'.DAT',0
.endm
.endm
;----------------------------------------------------------------
.bss
.align 4
patbuf_cur_num: .ds.l 1
.even
patbuf: .ds.b PATBUF_SIZE_UNIT
;----------------------------------------------------------------
;ボタンが押されるまで待つ
;>d0.l:0=左ボタンが押された,-1=右ボタンが押された
;>n-flag:mi=右ボタンが押された
.text
.align 4,$2048
wait_button:
1: IOCS _MS_GETDT
tst.b d0
bne 90f
tst.w d0
beq 1b
2: IOCS _MS_GETDT
tst.b d0
bne 90f
tst.w d0
bne 2b
moveq.l #0,d0
99: rts
90: moveq.l #-1,d0
bra 99b
;----------------------------------------------------------------
;手番を表示する
;<d6.b:自分の石
.text
.align 4,$2048
draw_turn::
.if 1
;スプライトで表示
movem.l d0-d5,-(sp)
bsr super
move.l #$80000000+TURN_SPRITE,d1
TURN_SLIDE_UNIT equ (16*MOJI_WHITE_X-16*MOJI_BLACK_X)/10
move.l #16*MOJI_BLACK_Y+32+16,d3
move.l #TURN_PALETTE*256+TURN_PATTERN,d4
moveq.l #3,d5
;<d1.l:スプライト番号,bit31=nowait
;<d2.l:X座標+16
;<d3.l:Y座標+16
;<d4.l:パレットブロック×256+パターン番号,bit14=hrev,bit15=vrev
;<d5.l:0=表示しない,1=BG0>BG1>SP,2=BG0>SP>BG1,3=SP>BG0>BG1
cmp.b #B,d6
bne 10f
;白→黒
tst.w turn_count
beq 2f
move.w #16*MOJI_WHITE_X-1+16-TURN_SLIDE_UNIT,d2
1: bsr keyctrl_vwait
movem.l d1-d5,-(sp)
IOCS _SP_REGST
movem.l (sp)+,d1-d5
addq.b #1,d1
add.w #26-16,d2
movem.l d1-d5,-(sp)
IOCS _SP_REGST
movem.l (sp)+,d1-d5
subq.b #1,d1
sub.w #26-16+TURN_SLIDE_UNIT,d2
cmp.w #16*MOJI_BLACK_X-1+16,d2
bhi 1b
2: move.w #16*MOJI_BLACK_X-1+16,d2
bsr keyctrl_vwait
movem.l d1-d5,-(sp)
IOCS _SP_REGST
movem.l (sp)+,d1-d5
addq.b #1,d1
add.w #26-16,d2
; movem.l d1-d5,-(sp)
IOCS _SP_REGST
; movem.l (sp)+,d1-d5
bra 20f
10:
;黒→白
tst.w turn_count
beq 2f
move.w #16*MOJI_BLACK_X-1+16+TURN_SLIDE_UNIT,d2
1: bsr keyctrl_vwait
movem.l d1-d5,-(sp)
IOCS _SP_REGST
movem.l (sp)+,d1-d5
addq.b #1,d1
add.w #26-16,d2
movem.l d1-d5,-(sp)
IOCS _SP_REGST
movem.l (sp)+,d1-d5
subq.b #1,d1
sub.w #26-16-TURN_SLIDE_UNIT,d2
cmp.w #16*MOJI_WHITE_X-1+16,d2
blo 1b
2: move.w #16*MOJI_WHITE_X-1+16,d2
bsr keyctrl_vwait
movem.l d1-d5,-(sp)
IOCS _SP_REGST
movem.l (sp)+,d1-d5
addq.b #1,d1
add.w #26-16,d2
; movem.l d1-d5,-(sp)
IOCS _SP_REGST
; movem.l (sp)+,d1-d5
20:
bsr user
movem.l (sp)+,d0-d5
rts
.else
;テキストで表示
movem.l d0/d2-d3/a1,-(sp)
lea.l (-2*6,sp),sp
cmp.b #B,d6
seq.b d2
ext.w d2
movea.l sp,a1
move.w #1,(a1)+
move.l #((16*MOJI_BLACK_X-1)<<16)+(16*MOJI_BLACK_Y+32),(a1)+
move.l #((1+24+1-1)<<16)+(3-1),(a1)+
move.w d2,(a1)+
movea.l sp,a1
IOCS _TXFILL
not.w d2
movea.l sp,a1
move.w #1,(a1)+
move.l #((16*MOJI_WHITE_X-1)<<16)+(16*MOJI_WHITE_Y+32),(a1)+
move.l #((1+24+1-1)<<16)+(3-1),(a1)+
move.w d2,(a1)+
movea.l sp,a1
IOCS _TXFILL
lea.l (2*6,sp),sp
movem.l (sp)+,d0/d2-d3/a1
rts
.endif
;----------------------------------------------------------------
;ESCキーとTABキーでコマ送りの処理を行う
.text
.align 4,$2048
keyctrl:
move.l d0,-(sp)
tst.b esc_stat
bne 20f
10: IOCS _B_KEYSNS
tst.l d0
beq 99f
cmp.b #$03,d0
bne @f
DOS _KEYSNS
@@: IOCS _B_KEYINP
cmp.b #$1B,d0
bne 99f
st.b esc_stat
;ESCが押されたとき
20: IOCS _B_KEYINP
tst.l d0
beq 20b
cmp.b #$09,d0
beq 99f
cmp.b #$1B,d0
bne 20b
sf.b esc_stat
99: move.l (sp)+,d0
rts
.data
esc_stat: .dc.b 0
;----------------------------------------------------------------
;垂直帰線期間待ちルーチン
; SHIFTキーが押されていたら待たない
; スーパーバイザモードで呼び出すこと
.text
.align 4,$2048
keyctrl_vwait:
bsr keyctrl
vwait:
btst.b #SHIFT_KEY_BIT_SHIFT,SHIFT_KEY_MAP
bne 9f
@@: btst.b #4,GPIPDR ;垂直表示期間を待つ
beq @b
@@: btst.b #4,GPIPDR ;垂直帰線期間を待つ
bne @b
9: rts
;----------------------------------------------------------------
;ファイルをオープンする
; 自分自身のパスを基準にする
;<(8,sp).w:モード
;<(4,sp).l:ファイル名
;>d0.l:ハンドラ番号,負数=エラー
.text
.align 4,$2048
open_file:
movem.l a0-a1,-(sp)
lea.l (-90,sp),sp
movea.l sp,a0
lea.l prog_head-$100+$80,a1
bsr strcpy
movea.l (90+4*2+4,sp),a1
bsr strcpy
move.w (90+4*2+4+4,sp),-(sp)
pea.l (2,sp)
DOS _OPEN
addq.l #6,sp
lea.l (90,sp),sp
movem.l (sp)+,a0-a1
tst.l d0
rts
;----------------------------------------------------------------